[
  {
    "path": ".github/scripts/prChangelog_NoAuth.py",
    "content": "# Gets the PR associated with a commit and then writes all of the commit messages to a changelog\n# sys.argv[1] = reponame\n# sys.argv[2] = SHA key of commit to test\n# sys.argv[3] = path to change log\n\nimport json\nimport sys\nimport requests\n\nrepo = sys.argv[1]\nsha = sys.argv[2]\nchangelogPath = sys.argv[3]\n\n# Get the pull request that's related to the commit\npulls_url = f\"https://api.github.com/repos/hexthedev/{repo}/commits/{sha}/pulls\"\npulls_headers = {\n    'User-Agent' : 'hexthedev',\n    'Accept' : 'application/vnd.github.groot-preview+json'\n}\n\npulls_req = requests.get(pulls_url, headers = pulls_headers)\n\nif pulls_req.status_code != 200:\n    # If status fails, stop changelog creation\n    raise Exception(f'Cannot retrieve pulls from commit:{sha} in repo:{repo}')\n\npulls_json = json.loads(pulls_req.text)\n\n# Follow the commits link and get the commit messages in order\ncommits_url = pulls_json[0][\"_links\"][\"commits\"][\"href\"] \ncommits_headers = {\n    'User-Agent' : 'hexthedev'\n}\n\ncommits_req = requests.get(commits_url, headers = commits_headers)\n\nif commits_req.status_code != 200:\n    raise Exception(f'Cannot get commit messages from {commits_url}')\n\ncommits_json = json.loads(commits_req.text)\n\n# Write the changelog\ncommits_list = []\nfor commit in commits_json:\n    commits_list.append(commit[\"commit\"][\"message\"])\n\nwith open(changelogPath, 'w') as f:\n    f.truncate(0)\n    for com in commits_list:\n        f.write(f'* {com}\\n')"
  },
  {
    "path": ".github/scripts/versionUpdater.py",
    "content": "import json\nimport sys\nimport os\n\npath = sys.argv[1]\n\noutjson = {}\nnewVersion = \"\" \n\nwith open(path, 'r') as f:\n    j = json.load(f)\n    s = j[\"version\"]\n    spl = s.split(\".\")\n    spl[2] = str(int(spl[2])+1)\n    newVersion = \".\".join(spl)\n    j[\"version\"] = newVersion\n    outjson = j\n\nwith open(path, 'w') as f:\n    json.dump(outjson, f)\n\n# Output\nprint(newVersion)"
  },
  {
    "path": ".github/workflows/unitypackage.yml",
    "content": "name: unitypackage\n\non:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - './CHANGELOG.md'\n      - './package.json'\n\nenv:\n  VAR_NAME: value\n\njobs:\n  build_job:\n    name: Build Job\n    runs-on: ubuntu-20.04\n\n    steps:\n      # ----- DEPENDENCIES -----\n      # Install the pip dependencies\n      - name: Install Dependencies\n        run: pip install requests\n\n      # ----- CHECKOUT -----\n      # Checks out a copy of your repository on the ubuntu-latest \n      - name: Checkout code\n        uses: actions/checkout@v2\n\n      # ----- WORK -----\n      # Update a version in some json\n      - name: Run a test python script version update\n        run: |\n          export BUMPED_VERSION=`python ./.github/scripts/versionUpdater.py ./package.json`\n          echo \"::set-output name=version::$BUMPED_VERSION\"\n        id: versioner\n\n      # Get the SHA of the current git head\n      - name: Output SHA Head # Note: You can pass command sup through stdout\n        run: |\n          export CUR_SHA=`git rev-parse HEAD`\n          echo \"::set-output name=sha::$CUR_SHA\"\n        id: head_sha\n\n      # Create the changleog using the commit sha and grabbing the commit messages\n      - name: Run a changelog creator\n        run: python ./.github/scripts/prChangelog_NoAuth.py ${{ github.event.repository.name }} ${{steps.head_sha.outputs.sha}} ./CHANGELOG.md\n\n      # Commit the changes to the repo\n      - name: Do git commit\n        run: |\n          git config user.name hexthedev\n          git config user.email jamesmccafferty@live.ca\n          git add .\n          git commit -m \"Github Actions Commit\"\n          git push\n\n      # ----- RELEASE -----\n      # Get the SHA of the current HEAD (after the commit)\n      - name: Output SHA Head # Note: You can pass command sup through stdout\n        run: |\n          export CUR_SHA=`git rev-parse HEAD`\n          echo \"::set-output name=sha::$CUR_SHA\"\n        id: head_sha_new    \n\n      # Make a Release at the commit\n      - name: Create Release\n        id: create_release\n        uses: actions/create-release@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token\n        with:\n          tag_name: v${{ steps.versioner.outputs.version }}\n          release_name: Release v${{ steps.versioner.outputs.version }}\n          body_path: CHANGELOG.md\n          draft: false\n          prerelease: true\n          commitish : ${{steps.head_sha_new.outputs.sha}}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "* version specific UnityWebRequest.Post | UnityWebRequest.PostWwwForm\n* Merge branch 'hexthedev:main' into uwr_2022\n"
  },
  {
    "path": "CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: 79adca46a4928e1469b0b75ab7f94ae6\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Documentation/1_Overview.md",
    "content": "# Context\nThe `OpenAi Api Unity` library is a wrapper for the OpenAI Api.\n\nThe following technical decisions were made during development:\n* All json serialization and deserialization is performed with a custom serializer so that the library has no dependencies\n* Classes and objects were created to make the libraries api call syntax as close to the api calls shown in the [OpenAi Api Reference](https://beta.openai.com/docs/api-reference)\n* All Api calls are implemented in two ways, as async functions and as Coroutines.\n\n## Getting Started\nAll api calls are accessible through the `OpenAiApiV1` object. When created, it requires initialization with a `SAuthArgsV1` which provides the authentication keys. For details [See Authentication](https://github.com/hexthedev/OpenAi-Api-Unity/blob/main/Documentation/2_Authentication.md)\n\n`OpenAiApiV1` is not a `MonoBehaviour`, so it needs to be initalized somewhere to be used in a scene. The `OpenAiApiGatewayV1` prefab is a singleton that handles the initalization of the `OpenAiApiV1` automatically during the `Start()` method. This can be added via the menu `OpenAi > V1 > CreateGateway`. You can also disable the automatic initalization on `Start()`, and instead initalize the `OpenAiApiV1` manually. The `OpenAiApiV1` object is accessed through `OpenAiApiGatewayV1.Instance.Api`. For details [See ApiCalls](https://github.com/hexthedev/OpenAi-Api-Unity/blob/main/Documentation/3_ApiCalls.md)\n\nOnce you're able to access the `OpenAiApiV1` object, all api calls follow the [OpenAi Api Reference](https://beta.openai.com/docs/api-reference) as closely as possible. For example, the api call `https://api.openai.com/v1/engines/{engine_id}/completions` called Create Completions in the docs is called using the pattern `OpenAiApiV1Instance.Engines.Engine(\"<engine_id>\").Completions.CreateCompletion`. For details [See ApiCalls](https://github.com/hexthedev/OpenAi-Api-Unity/blob/main/Documentation/3_ApiCalls.md)\n\n## Serialization\nA custom json serializer/deserializer was implemented to remove a dependency on Newtonsoft. This was the make the library more lightweight and to avoid some problems compiling Newtonsoft on some platforms. \n\nFor details [See JsonSerialization](https://github.com/hexthedev/OpenAi-Api-Unity/blob/main/Documentation/4_JsonSerialization.md)\n"
  },
  {
    "path": "Documentation/1_Overview.md.meta",
    "content": "fileFormatVersion: 2\nguid: 68aabfede4eeba444abc34db5c63b1e7\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Documentation/2_Authentication.md",
    "content": "# Context\nThe `OpenAi Api` is currently in beta. In order to get access you need a private api key which is aquired by signing up for the beta at the [OpenAi Api Website](https://beta.openai.com/). When accepted you'll be able to access your api key on the [Developer QuickStart Page](https://beta.openai.com/docs/developer-quickstart)\n\nIndividuals that are part of an organization can also use an organization key. I'm not sure where this is found, as I do not have one. The organization key is used when individuals are using api quotas from multiple organizations, and they want to specify which quota to use. \n\n# Authenticating in OpenAi Api Unity\nAuthentication info is entered in the `SOAuthArgsV1` object. This Scriptble Object is a required input for all API prefabs. \n\nThe `SOAuthArgsV1` has two modes.\n   * Local File\n   * String\n\n### Local File\nLocal file mode pulls a json from a the local file path `~/.openai/auth.json` (Linux/Mac) or `%USERPROFILE%/.openai/auth.json` (Windows). The json should be formatted as follows:\n\n```json\n// auth.json\n{\n  \"private_api_key\":\"<YOUR_KEY>\",\n  (optional) \"organization\":\"<YOUR_ORGANIZATION_ID>\"\n}\n```\n\nThe file is read and deserailized when the `OpenAiApiGatewayV1` is initialized\n\n### String\nString mode lets user input their OpenAI Api credentials as plain text strings. This is a bad idea in most cases though, because commiting this to a public repo reveals your key. \n\n"
  },
  {
    "path": "Documentation/2_Authentication.md.meta",
    "content": "fileFormatVersion: 2\nguid: 6af7f80e91631e244887f81043fc5a06\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Documentation/3_ApiCalls.md",
    "content": "# Context\nThe `OpenAi Api Unity` library is a wrapper for REST API calls made to the OpenAi Api. REST API calls are HTTP requests sent directly to the OpenAI Api resource endpoints with some simple authentication. \n\nAn example of an actual api call looks something like this:\n```\nhttps://api.openai.com/v1/engines/davinci/completions\n```\n\nYou can read more about the details of these api calls using the [OpenAi Api Reference](https://beta.openai.com/docs/api-reference)\n\nThe `OpenAi Api Unity` library implements these Api calls using Unity's built-in [UnityWebRequest](https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html) class and a custom Json Serailizer/Deserializer. \n\nHTTP requests cannot occur syncronously without causing the thread to pause. This is not ideal, so all api calls are implemented as `async` functions and as Coroutines. \n\n# MonoBehaviours\nThe `OpenAiApiGatewayV1` is a prefab and `MonoBehaviour` singleton that allows any script in a Unity scene to access the api. This Monobehaviour simply controls the initalization of an `OpenAiApiV1` object, which actually houses the api logic. \n\nYou can add an `OpenAiApiGatewayV1` to the current scene using the menu item `OpenAi > V1 > CreateGateway`\n\nYou don't have to use the `OpenAiApiGatewayV1` prefab to access the api. This is simply one way that the `OpenAiApiV1` can be initialized. A custom `MonoBehaviour` can be written easily, it just needs to create the `OpenAiApiV1` object with valid authentication args. \n\n## Completer\nThe `OpenAiApiCompleterV1` is a simpler class that automatically initalizes the `OpenAiApiV1` object with use for a single engine, and provides the `Complete()` method to allow simple completions. \n\nYou can add an `OpenAiApiCompleterV1` to the current scene using the menu item `OpenAi > V1 > CreateCompleter`\n\n# API Implementation\nAs much as possible, the syntax for performing a call using `OpenAi Api Unity` follows the same structure as the api calls found in the [OpenAi Api Reference](https://beta.openai.com/docs/api-reference). \n\nAll Api calls start with an `OpenAiApiV1` object. \n\nFor example:\n\n```csharp\n# this api call (In the Create Completion Section of the docs)\nPOST\nhttps://api.openai.com/v1/engines/davinci/completions\n\n{\n    \"prompt\" : \"hey\",\n    \"max_tokens\" : 8\n}\n\n# is called using the following structure \nclass ApiExample : MonoBehaviour \n{\n    public OpenAiApiV1 api;\n\n    void LogCompletion()\n    {\n        api.Engines.Engine(\"davinci\").Completions.CreateCompletionCoroutine(\n            this, \n            new CompletionRequestV1() { prompt = \"hey\", max_tokens = 8},\n            (result) => { Debug.Log(result.Result.choices[0].text);}\n        );\n    }\n}\n```\n\nLets break this down.\n\nEach step in an api call is called a resource. `api.Engines` returns the `EnginesResource` which allows us to use any resource call related to engines. For example, the [OpenAi Api List Engines Reference](https://beta.openai.com/docs/api-reference/list-engines) shows the list engines api call. `GET\nhttps://api.openai.com/v1/engines` which is called using `api.Engines.ListEnginesCoroutine` function.\n\nIn some cases, resources are parameters. Like in the [OpenAi Api Retrieve Engine Reference](https://beta.openai.com/docs/api-reference/retrieve-engine). In this case `GET https://api.openai.com/v1/engines/{engine_id}` the engine is a parameter. To get an Engine resource, we provide an argument: `api.Engines.Engine(\"<engine_id>\")`\n\nMaking an api call from a resource is always implemented as an `async` function and as a Coroutine. So the api call `POST https://api.openai.com/v1/engines/{engine_id}/completions` has two functions, `api.Engines.Engine(\"{engine_id}\").Completions.CreateCompletionCoroutine` and `api.Engines.Engine(\"<engine_id>\").Completions.CreateCompletionAsync`.\n\n## Async vs Coroutine functions\nAsync functions use `async/await` syntax to return an `ApiResult`. The signature looks like this `async Task<ApiResult<{ResultType}>> {ApiCall}Async({RequestType} request)`\n\nCoroutine functions require a MonoBehaviour and callbacks. The basic signature looks like this `Coroutine {ApiCall}Coroutine(MonoBehaviour mono, {RequestType} request, Action<ApiResult<{ResultType}>> onResult)`. \n\n### Coroutine Scripting\nThe Coroutine implementations run the API request as a task, and check the tasks completion every frame. \n\n```csharp\n# ExampleMono.cs\nusing OpenAi.Unity.V1;\n\nusing UnityEngine;\n\npublic class Example : MonoBehaviour\n{\n    public void DoApiCompletion()\n    {\n        Debug.Log(\"Performing Completion in Play Mode\");\n\n        OpenAiCompleterV1.Instance.Complete(\n            \"prompt\",\n            s => Debug.Log(s),\n            e => Debug.LogError(e.StatusCode)\n        );\n    }\n}\n```\n\n### Async scripts\nAsync implementations let you use the `async/await` style syntax to perform api calls.\n\n```csharp\n// MyEditor.cs\nusing OpenAi.Api.V1;\nusing OpenAi.Unity.V1;\n\nusing UnityEditor;\n\nusing UnityEngine;\n\npublic class MyEditor : EditorWindow\n{\n    [MenuItem(\"MyMenu/MyEditor\")]\n    public static void ShowWindow()\n    {\n        EditorWindow.GetWindow(typeof(MyEditor));\n    }\n\n    async void OnGUI()\n    {\n        SOAuthArgsV1 auth = ScriptableObject.CreateInstance<SOAuthArgsV1>();\n        OpenAiApiV1 api = new OpenAiApiV1(auth.ResolveAuth());\n\n        if (api != null && GUILayout.Button(\"Do Completion\"))\n        {\n            Debug.Log(\"Performing Completion in Editor Time\");\n\n            ApiResult<CompletionV1> comp = await api.Engines.Engine(\"davinci\").Completions.CreateCompletionAsync(\n                new CompletionRequestV1()\n                {\n                    prompt = \"test\",\n                    max_tokens = 8\n                }\n            );\n\n            Debug.Log(comp.IsSuccess);\n            Debug.Log(comp.Result.choices[0].text);\n        }\n    }\n}\n```\n\n## ApiResult\nThe `ApiResult` class is returned to encapsulate any exception that occurs during the request. There are many reasons api requests might fail, so the `ApiResult` exists so that any error can be handled, or at the very least a successful request can be verified. \n\n## Extra Notes\n* The [Create Completion](https://beta.openai.com/docs/api-reference/create-completion) has a `stream` parameters that changes the way the completion result is received. This required a different implementation for stream and non-stream calls. As such, there are separate functions for the stream and non-stream version of completion. Calling `api.Engines.Engine(\"{engine_id}\").Completions.CreateCompletionCoroutine` will automatically set `stream=false` and `api.Engines.Engine(\"{engine_id}\").Completions.CreateCompletionCoroutine_EventStream` will automatically set `stream=true` no matter the input.\n"
  },
  {
    "path": "Documentation/3_ApiCalls.md.meta",
    "content": "fileFormatVersion: 2\nguid: bc00ea052f096d8409eb252f4855e8ba\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Documentation/4_JsonSerialization.md",
    "content": "# Context\nTo keep `OpenAi Api Unity` portable, it was important to reduce dependencies as much as possible. Making the library easy to use and light weight was a priority. \n\nAs such, a simple, bare-minimum custom Json Serailizer/Deserializer was written. The serailizer shipped with `OpenAi Api Unity` is not intended for use outside of the library, and has only been tested and developed to handle JSON syntax present in OpenAi Api HTTP request/responses.\n\nAs more api calls are introduced, the Json Serailizer will be updated as needed. \n\nAll custom Json code can be found in the `OpenAi.Json` namespace"
  },
  {
    "path": "Documentation/4_JsonSerialization.md.meta",
    "content": "fileFormatVersion: 2\nguid: fe8e132778ca03748b12aab30ca10cfe\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Documentation.meta",
    "content": "fileFormatVersion: 2\nguid: 8bc73d1c9ca97e54cbe2c98a632c400a\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Examples/EMExampleChatRuntimeScene.cs",
    "content": "﻿using UnityEditor;\nusing UnityEditor.SceneManagement;\nusing UnityEngine;\n\npublic static class ExampleChatRuntimeScene\n{\n    private const string cSceneName = \"ExampleChatRuntimeScene\";\n\n    [MenuItem(\"OpenAi/Examples/Chat at Runtime\")]\n    public static void OpenScene()\n    {\n        string[] assets = AssetDatabase.FindAssets(cSceneName);\n\n        string path = null;\n        foreach (string guid in assets)\n        {\n            path = AssetDatabase.GUIDToAssetPath(guid);\n        }\n\n        if (string.IsNullOrEmpty(path))\n        {\n            Debug.LogError($\"Cannot find the scene: {cSceneName}\");\n            return;\n        }\n\n        string newScenePath = $\"Assets/{cSceneName}.unity\";\n        AssetDatabase.CopyAsset(path, newScenePath);\n        EditorSceneManager.OpenScene(newScenePath);\n\n        AssetDatabase.Refresh();\n        Selection.activeObject = AssetDatabase.LoadAssetAtPath(newScenePath, typeof(Object));\n    }\n}\n"
  },
  {
    "path": "Editor/Scripts/Examples/EMExampleChatRuntimeScene.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e0a27e5aef073284da820f4ce2ced1f4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Examples/EMExampleOpenAiApiRuntimeScene.cs",
    "content": "﻿using UnityEditor;\nusing UnityEditor.SceneManagement;\nusing UnityEngine;\n\npublic static class ExampleOpenAiApiRuntimeScene\n{\n    private const string cSceneName = \"ExampleOpenAiApiRuntimeScene\";\n\n    [MenuItem(\"OpenAi/Examples/Completion at Runtime\")]\n    public static void OpenScene()\n    {\n        string[] assets = AssetDatabase.FindAssets(cSceneName);\n\n        string path = null;\n        foreach (string guid in assets)\n        {\n            path = AssetDatabase.GUIDToAssetPath(guid);\n        }\n\n        if (string.IsNullOrEmpty(path))\n        {\n            Debug.LogError($\"Cannot find the scene: {cSceneName}\");\n            return;\n        }\n\n        string newScenePath = $\"Assets/{cSceneName}.unity\";\n        AssetDatabase.CopyAsset(path, newScenePath);\n        EditorSceneManager.OpenScene(newScenePath);\n\n        AssetDatabase.Refresh();\n        Selection.activeObject = AssetDatabase.LoadAssetAtPath(newScenePath, typeof(Object));\n    }\n}\n"
  },
  {
    "path": "Editor/Scripts/Examples/EMExampleOpenAiApiRuntimeScene.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 93f30114c6062d94695cfb919c9faebd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Examples/ExampleOpenAiApiUnityEditor.cs",
    "content": "﻿// MyEditor.cs\nusing OpenAi.Api.V1;\nusing OpenAi.Unity.V1;\n\nusing System.Threading.Tasks;\n\nusing UnityEditor;\n\nusing UnityEngine;\n\nnamespace OpenAi.Examples\n{\n    public class ExampleOpenAiApiUnityEditor : EditorWindow\n    {\n        private string _input = \"Enter Prompt here\";\n\n        private string _output;\n\n        [MenuItem(\"OpenAi/Examples/Completion In Editor Window\")]\n        public static void ShowWindow()\n        {\n            EditorWindow.GetWindow(typeof(ExampleOpenAiApiUnityEditor));\n        }\n\n        void OnGUI()\n        {\n            GUI.enabled = false;\n            EditorGUILayout.ObjectField(\"Code:\", MonoScript.FromScriptableObject(this), typeof(ScriptableObject), false);\n            GUI.enabled = true;\n\n            SOAuthArgsV1 auth = ScriptableObject.CreateInstance<SOAuthArgsV1>();\n            OpenAiApiV1 api = new OpenAiApiV1(auth.ResolveAuth());\n\n            _input = EditorGUILayout.TextField(_input); \n\n            if (api != null && GUILayout.Button(\"Do Completion\"))\n            {\n                Debug.Log(\"Performing Completion in Editor Time\");\n                DoEditorTask(api);\n            }\n\n            if (!string.IsNullOrEmpty(_output))\n            {\n                GUI.enabled = false;\n                EditorGUILayout.TextField(_output);\n                GUI.enabled = true;\n            }\n        }\n\n        private async Task DoEditorTask(OpenAiApiV1 api)\n        {\n            _output = \"Performing completion...\";\n\n            ApiResult<CompletionV1> comp = await api.Engines.Engine(\"davinci\").Completions.CreateCompletionAsync(\n                    new CompletionRequestV1()\n                    {\n                        prompt = \"test\",\n                        max_tokens = 8\n                    }\n                );\n\n            if (comp.IsSuccess)\n            {\n                _output = $\"{comp.Result.choices[0].text}\";\n            }\n            else\n            {\n                _output = $\"ERROR: StatusCode={comp.HttpResponse.responseCode} - {comp.HttpResponse.error}\";\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Scripts/Examples/ExampleOpenAiApiUnityEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cbe89ff476c953f4990fab5f5bf4c640\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Examples.meta",
    "content": "fileFormatVersion: 2\nguid: 02674ce6ed1d7ed4a84d3c6d31346b72\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Unity/V1/Auth/SOAuthArgsV1Editor.cs",
    "content": "﻿using OpenAi.Unity.V1;\n\nusing UnityEditor;\n\nusing UnityEngine;\n\nusing static OpenAi.Unity.V1.SOAuthArgsV1;\n\nnamespace OpenAi.Api.Unity.V1\n{\n    [CustomEditor(typeof(SOAuthArgsV1))]\n    public class OpenAiApiAuthArgsEditor : Editor\n    {\n        SerializedProperty AuthType;\n        SerializedProperty PrivateApiKey;\n        SerializedProperty Organization;\n        void OnEnable()\n        {\n            AuthType = serializedObject.FindProperty(\"AuthType\");\n            PrivateApiKey = serializedObject.FindProperty(\"PrivateApiKey\");\n            Organization = serializedObject.FindProperty(\"Organization\");\n        }\n        public override void OnInspectorGUI()\n        {\n            serializedObject.Update();\n\n            GUI.enabled = false;\n            EditorGUILayout.ObjectField(\"Script\", MonoScript.FromScriptableObject((SOAuthArgsV1)target), typeof(SOAuthArgsV1), false);\n            GUI.enabled = true;\n            EditorGUILayout.Space();\n\n            EditorGUILayout.PropertyField(AuthType);\n\n            switch((EAuthProvisionMethod)AuthType.enumValueIndex)\n            {\n                case EAuthProvisionMethod.LocalFile:\n                    EditorGUILayout.HelpBox(\"This auth method will attempt to find the private key at `~/.openai/auth.json` (Linux/Mac) or `%USERPROFILE%/.openai/auth.json` (Windows). If this file does not exist or the key is not present, api calls will fail\", MessageType.Warning);\n                    break;\n                case EAuthProvisionMethod.String:\n                    EditorGUILayout.PropertyField(PrivateApiKey);\n                    EditorGUILayout.PropertyField(Organization);\n                    break;\n            }\n\n            serializedObject.ApplyModifiedProperties();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Scripts/Unity/V1/Auth/SOAuthArgsV1Editor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3f6e6a6d360308d42817d969ae55bd3f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Unity/V1/Auth.meta",
    "content": "fileFormatVersion: 2\nguid: 5805db06a168eba4a9d18cd186ee00d8\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Unity/V1/EMPrefabs.cs",
    "content": "﻿using UnityEditor;\n\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\n\nnamespace OpenAi.Unity.V1\n{\n    public static class EMPrefabsV1\n    {\n        [MenuItem(\"OpenAi/V1/CreateGateway\")]\n        public static void CreateGateway() => SpawnPrefab(\"OpenAiApiGatewayV1\");\n\n        [MenuItem(\"OpenAi/V1/CreateCompleter\")]\n        public static void CreateCompleter() => SpawnPrefab(\"OpenAiCompleterV1\");\n\n        [MenuItem(\"OpenAi/V1/CreateChatCompleter\")]\n        public static void CreateChatCompleter() => SpawnPrefab(\"OpenAiChatCompleterV1\");\n\n\n        private static void SpawnPrefab(string name)\n        {\n            string[] assets = AssetDatabase.FindAssets(name);\n\n            GameObject obj = null;\n\n            foreach (string guid in assets)\n            {\n                string apath = AssetDatabase.GUIDToAssetPath(guid);\n                obj = AssetDatabase.LoadAssetAtPath<GameObject>(apath);\n\n                if (obj != null) break;\n            }\n\n            if (obj == null)\n            {\n                Debug.LogError($\"Cannot find the prefab: {name}\");\n                return;\n            }\n\n            Object inst = PrefabUtility.InstantiatePrefab(obj);\n            Selection.activeObject = inst;\n            return;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Scripts/Unity/V1/EMPrefabs.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 50dc49b27bd81d54aadcda8893587046\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Unity/V1.meta",
    "content": "fileFormatVersion: 2\nguid: 305f7cea76954a5418ef8d00bf990e9e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts/Unity.meta",
    "content": "fileFormatVersion: 2\nguid: e7082c633e69c3e40a25864f088e5f39\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: d0e98a06002e536468e9c41eca65239c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/openai.api.unity.editor.asmdef",
    "content": "{\n    \"name\": \"openai.api.unity.editor\",\n    \"references\": [\n        \"GUID:762faf06f60fab647b9b71ae958fdf20\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": false,\n    \"precompiledReferences\": [],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Editor/openai.api.unity.editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 58a743fc042d1cc4bacc5a05c82a03f9\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor.meta",
    "content": "fileFormatVersion: 2\nguid: b899e02a35d43fb478005ecddced2557\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "License.md",
    "content": "MIT License\n\nCopyright (c) 2020 James McCafferty\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "License.md.meta",
    "content": "fileFormatVersion: 2\nguid: 46c8397f0ceee1d459015910980c4a2e\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "README.md",
    "content": "**WARNING**: This project is officially dead. No updates will come, and as such I moved it to the archived state. If more complete implementation of the current API come to my awareness I will post here. Sadly, I do not have time to take PRs or manage this repo.\n\n# OpenAi Api Unity\nA simple OpenAI API wrapper for Unity \n\nThis is a community library. I am not officially affiliated with OpenAi.\n\nBig shout out to:\n* [@OkGoDoIt](https://github.com/OkGoDoIt): This code base is heavily based on the [OpenAI-API-dotnet Repo](https://github.com/OkGoDoIt/OpenAI-API-dotnet), which is a dotnet wrapper for the OpenAI Api\n* [@ivomarel](https://github.com/ivomarel): For the [OpenAI_Unity Repo](https://github.com/hexthedev/OpenAI_Unity)\n\nTo report bugs, problems, suggestions please submit [Github Issues](https://github.com/hexthedev/OpenAi-Api-Unity/issues)\n\nIf anyone wants to contribute, [Pull Requests](https://github.com/hexthedev/OpenAi-Api-Unity/pulls) are welcome\n\n## Status\n| Api Call | Implemented | Bare-Minimum Tests | Thourough Tests | \n| --- | --- | --- | --- |\n| `GET /engines` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |\n| `GET /engines/{engine_id}` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |\n| `POST /engines/{engine_id}/completions` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |\n| `GET /engines/{engine_id}/completions/browser_stream` | :x: | :heavy_minus_sign: | :heavy_minus_sign: |\n| `GET /files` | :heavy_check_mark: | :heavy_minus_sign: | :heavy_minus_sign: |\n| `POST /files/{file_id}` | :x: | :heavy_minus_sign: | :heavy_minus_sign: |\n| `GET /files/{file_id}` | :heavy_check_mark: | :heavy_minus_sign: | :heavy_minus_sign: |\n| `POST /chat/completions` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |\n\n## Overview\nThis is a simple OpenAI API wrapper that implements the API calls found in the [OpenAI Api Reference](https://beta.openai.com/docs/api-reference) as Coroutines and Async functions. \n\nThe syntax follows the docs as closely as possible. For example, the API call Create Completion at the endpoint `https://api.openai.com/v1/engines/{engine_id}/completions` is called using `OpenAiApiV1.Engines.Engine(\"<engine_id>\").Completions.CreateCompletionCoroutine`. The API call Chat Completion at the endpoint `https://api.openai.com/v1/chat/completions` is called using `OpenAiApiV1.Chat.Completions.CreateChatCompletionCoroutine`.\n\nTo learn more:\n1. Read the Quick Start section below to see a basic example of how to use the wrapper\n2. Refer to the [Documentation](https://github.com/hexthedev/OpenAi-Api-Unity/tree/main/Documentation) for a more detailed explanation of the library\n\n### What is and isn't tested\nI've tested the list below. Testing for all other use cases will come with time\n* Editor scripts and editor windows using async versions of API calls\n* Coroutine api calls in Play Mode\n  * I have not tested builds, but should work since it's really just Native C#. Any issues will likely be platform related. \n* Unit Tested basic use cases and any issue I found along the way, to ensure stability\n* Only tested on a Windows machine. If Linux/Mac authentication doesn't work as expected, please let me know. \n* I do not have an organization, I have not been able to test the organization key functionality during authentication\n\n# Quick Start\n\nSee video: https://youtu.be/Ju-i0sxsX7E\n\n## Install\n\n**Unity Package Manager (Recommended):**\nGo to the Unity Package Manager (`Window > Package Manager`), and click the `+` icon in the top left hand corner. Choose `Add package from git URL...` and provide the url `https://github.com/hexthedev/OpenAi-Api-Unity.git`.\n\n**Unity Package:**\nGo to https://github.com/hexthedev/OpenAi-Api-Unity/releases and download the desired release. Once downloaded, open the file and follow the instructions to import it into Unity. \n\n**Git Submodule**:\nFor more advanced git users, you can simply add this repo as a submodule in your assets folder. This is especially useful if you want to edit, change and version the `OpenAi Api Unity` code.\n\n## Authenticate\nAdd a file to the path `~/.openai/auth.json` (Linux/Mac) or `%USERPROFILE%/.openai/auth.json` (Windows)\n\nif you only have an API key, the `auth.json` should look like this\n```json\n{\n  \"private_api_key\":\"<YOUR_KEY>\"\n}\n```\n\nIf you have an organization key, the `auth.json` should look like this\n```json\n{\n  \"private_api_key\":\"<YOUR_KEY>\",\n  \"organization\":\"<YOUR_ORGANIZATION_ID>\"\n}\n```\n\n## Editor Script\nTo see an example of a completion in an editor script:\n  * From the top bar to to `OpenAi > Examples > Completion In Editor Window`.\n  * To see the code, Click the `Code` reference at the top of the window. \n\n## Play Script\nTo see an example of a completion at Runtime:\n  * If you're working on a scene, save the scene you are working on\n  * From the top bar click `OpenAi > Examples > Completion At Runtime`\n  * Look at the `CompletionExample` object in the hierarchy and check out the code in `ExampleOpenAiApiRuntime`\n  * Press play and run the scene\n\nTo see an example of chat completion at Runtime:\n  * If you're working on a scene, save the scene you are working on\n  * From the top bar click `OpenAi > Examples > Chat At Runtime`\n  * Look at the `ChatCompletionExample` object in the hierarchy and check out the code in `ExampleChatRuntime`\n  * Press play and run the scene\n\n# What Next\nThe above quick start is an extremely simple way to use the `OpenAi Api Unity` library. For more advanced use cases, refer to the [OpenAi Api Unity Documentation](https://github.com/hexthedev/OpenAi-Api-Unity/tree/main/Documentation)\n"
  },
  {
    "path": "README.md.meta",
    "content": "fileFormatVersion: 2\nguid: c0d42e9c4461c4b40ae3b624a4de9661\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Config/DefaultAuthArgsV1.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &11400000\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 82cfa4d983a7d91419ea8999b972a333, type: 3}\n  m_Name: DefaultAuthArgsV1\n  m_EditorClassIdentifier: \n  AuthType: 0\n  PrivateApiKey: \n  Organization: \n"
  },
  {
    "path": "Runtime/Config/DefaultAuthArgsV1.asset.meta",
    "content": "fileFormatVersion: 2\nguid: 6d0ce71886a13d44a9693a5e31c0a754\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Config/DefaultChatCompletionArgs.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &11400000\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 080e53b2b28b9684d819081e4e9b9de6, type: 3}\n  m_Name: DefaultChatCompletionArgs\n  m_EditorClassIdentifier: \n  temperature: 1\n  top_p: 1\n  n: 1\n  stop:\n  - \n  - \n  - \n  - \n  max_tokens: 2048\n  presence_penalty: 0\n  frequency_penalty: 0\n  user: \n"
  },
  {
    "path": "Runtime/Config/DefaultChatCompletionArgs.asset.meta",
    "content": "fileFormatVersion: 2\nguid: 3064ae573dfd1aa45bfc201f2bc5f0ed\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Config/DefaultCompletionArgs.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &11400000\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 6fd689c40e44326488e8c75b58e63175, type: 3}\n  m_Name: DefaultCompletionArgs\n  m_EditorClassIdentifier: \n  max_tokens: 32\n  temperature: 0.7\n  top_p: 1\n  stop:\n  - \n  - \n  - \n  - \n  presences_penalty: 0\n  frequency_penalty: 0\n"
  },
  {
    "path": "Runtime/Config/DefaultCompletionArgs.asset.meta",
    "content": "fileFormatVersion: 2\nguid: 672d04ddb1f852449bbdd712933b43f8\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Config.meta",
    "content": "fileFormatVersion: 2\nguid: fac516003fa24e448a19637f26126859\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Prefabs/OpenAiApiGatewayV1.prefab",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1 &2965647775477036486\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1041637925907717537}\n  - component: {fileID: 6326357910860361850}\n  m_Layer: 0\n  m_Name: OpenAiApiGatewayV1\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!4 &1041637925907717537\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2965647775477036486}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!114 &6326357910860361850\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2965647775477036486}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 2368cfe602a61dc47b9fceb48ea4dae0, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  InitializeOnStart: 1\n  Auth: {fileID: 11400000, guid: 6d0ce71886a13d44a9693a5e31c0a754, type: 2}\n"
  },
  {
    "path": "Runtime/Prefabs/OpenAiApiGatewayV1.prefab.meta",
    "content": "fileFormatVersion: 2\nguid: 15d84929ed54ded40904bb85c13f5b87\nPrefabImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Prefabs/OpenAiChatCompleterV1.prefab",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1 &2692144715385115183\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 2458975999970266705}\n  - component: {fileID: 2692144715385115182}\n  m_Layer: 0\n  m_Name: OpenAiChatCompleterV1\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!4 &2458975999970266705\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2692144715385115183}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!114 &2692144715385115182\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2692144715385115183}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 582650b353200ef458d8ce61588f26dc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  Auth: {fileID: 11400000, guid: 6d0ce71886a13d44a9693a5e31c0a754, type: 2}\n  Args: {fileID: 11400000, guid: 3064ae573dfd1aa45bfc201f2bc5f0ed, type: 2}\n  Model: 9\n  dialogue: []\n"
  },
  {
    "path": "Runtime/Prefabs/OpenAiChatCompleterV1.prefab.meta",
    "content": "fileFormatVersion: 2\nguid: 4e6ec076fabc0494db4fa5402d517a9f\nPrefabImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Prefabs/OpenAiCompleterV1.prefab",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1 &8905070302076984395\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 9000805303073374261}\n  - component: {fileID: 5490449287616113856}\n  m_Layer: 0\n  m_Name: OpenAiCompleterV1\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!4 &9000805303073374261\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 8905070302076984395}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!114 &5490449287616113856\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 8905070302076984395}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 00b92053656ca0643ab0d4d86e1387fa, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  Auth: {fileID: 11400000, guid: 6d0ce71886a13d44a9693a5e31c0a754, type: 2}\n  Args: {fileID: 11400000, guid: 672d04ddb1f852449bbdd712933b43f8, type: 2}\n  Engine: 6\n"
  },
  {
    "path": "Runtime/Prefabs/OpenAiCompleterV1.prefab.meta",
    "content": "fileFormatVersion: 2\nguid: f28446e696573d2418d2a68633c4a3b3\nPrefabImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Prefabs.meta",
    "content": "fileFormatVersion: 2\nguid: 286c91b0d5867e144a3e5bca108536f0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scenes/ExampleChatRuntimeScene.unity",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!29 &1\nOcclusionCullingSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_OcclusionBakeSettings:\n    smallestOccluder: 5\n    smallestHole: 0.25\n    backfaceThreshold: 100\n  m_SceneGUID: 00000000000000000000000000000000\n  m_OcclusionCullingData: {fileID: 0}\n--- !u!104 &2\nRenderSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 9\n  m_Fog: 0\n  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}\n  m_FogMode: 3\n  m_FogDensity: 0.01\n  m_LinearFogStart: 0\n  m_LinearFogEnd: 300\n  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}\n  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}\n  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}\n  m_AmbientIntensity: 1\n  m_AmbientMode: 0\n  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}\n  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}\n  m_HaloStrength: 0.5\n  m_FlareStrength: 1\n  m_FlareFadeSpeed: 3\n  m_HaloTexture: {fileID: 0}\n  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}\n  m_DefaultReflectionMode: 0\n  m_DefaultReflectionResolution: 128\n  m_ReflectionBounces: 1\n  m_ReflectionIntensity: 1\n  m_CustomReflection: {fileID: 0}\n  m_Sun: {fileID: 0}\n  m_IndirectSpecularColor: {r: 0.37311992, g: 0.38074034, b: 0.35872713, a: 1}\n  m_UseRadianceAmbientProbe: 0\n--- !u!157 &3\nLightmapSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 12\n  m_GIWorkflowMode: 1\n  m_GISettings:\n    serializedVersion: 2\n    m_BounceScale: 1\n    m_IndirectOutputScale: 1\n    m_AlbedoBoost: 1\n    m_EnvironmentLightingMode: 0\n    m_EnableBakedLightmaps: 1\n    m_EnableRealtimeLightmaps: 0\n  m_LightmapEditorSettings:\n    serializedVersion: 12\n    m_Resolution: 2\n    m_BakeResolution: 40\n    m_AtlasSize: 1024\n    m_AO: 0\n    m_AOMaxDistance: 1\n    m_CompAOExponent: 1\n    m_CompAOExponentDirect: 0\n    m_ExtractAmbientOcclusion: 0\n    m_Padding: 2\n    m_LightmapParameters: {fileID: 0}\n    m_LightmapsBakeMode: 1\n    m_TextureCompression: 1\n    m_FinalGather: 0\n    m_FinalGatherFiltering: 1\n    m_FinalGatherRayCount: 256\n    m_ReflectionCompression: 2\n    m_MixedBakeMode: 2\n    m_BakeBackend: 1\n    m_PVRSampling: 1\n    m_PVRDirectSampleCount: 32\n    m_PVRSampleCount: 512\n    m_PVRBounces: 2\n    m_PVREnvironmentSampleCount: 256\n    m_PVREnvironmentReferencePointCount: 2048\n    m_PVRFilteringMode: 1\n    m_PVRDenoiserTypeDirect: 1\n    m_PVRDenoiserTypeIndirect: 1\n    m_PVRDenoiserTypeAO: 1\n    m_PVRFilterTypeDirect: 0\n    m_PVRFilterTypeIndirect: 0\n    m_PVRFilterTypeAO: 0\n    m_PVREnvironmentMIS: 1\n    m_PVRCulling: 1\n    m_PVRFilteringGaussRadiusDirect: 1\n    m_PVRFilteringGaussRadiusIndirect: 5\n    m_PVRFilteringGaussRadiusAO: 2\n    m_PVRFilteringAtrousPositionSigmaDirect: 0.5\n    m_PVRFilteringAtrousPositionSigmaIndirect: 2\n    m_PVRFilteringAtrousPositionSigmaAO: 1\n    m_ExportTrainingData: 0\n    m_TrainingDataDestination: TrainingData\n    m_LightProbeSampleCountMultiplier: 4\n  m_LightingDataAsset: {fileID: 0}\n  m_LightingSettings: {fileID: 0}\n--- !u!196 &4\nNavMeshSettings:\n  serializedVersion: 2\n  m_ObjectHideFlags: 0\n  m_BuildSettings:\n    serializedVersion: 2\n    agentTypeID: 0\n    agentRadius: 0.5\n    agentHeight: 2\n    agentSlope: 45\n    agentClimb: 0.4\n    ledgeDropHeight: 0\n    maxJumpAcrossDistance: 0\n    minRegionArea: 2\n    manualCellSize: 0\n    cellSize: 0.16666667\n    manualTileSize: 0\n    tileSize: 256\n    accuratePlacement: 0\n    maxJobWorkers: 0\n    preserveTilesOutsideBounds: 0\n    debug:\n      m_Flags: 0\n  m_NavMeshData: {fileID: 0}\n--- !u!1 &3530426\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 3530427}\n  - component: {fileID: 3530429}\n  - component: {fileID: 3530428}\n  m_Layer: 5\n  m_Name: Label\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &3530427\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 3530426}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 895809921}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: -7.5, y: -0.5}\n  m_SizeDelta: {x: -35, y: -13}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &3530428\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 3530426}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 32\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 3\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: user\n--- !u!222 &3530429\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 3530426}\n  m_CullTransparentMesh: 1\n--- !u!1 &21594508\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 21594509}\n  - component: {fileID: 21594511}\n  - component: {fileID: 21594510}\n  m_Layer: 5\n  m_Name: Placeholder\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &21594509\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 21594508}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1908724337}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -0.5}\n  m_SizeDelta: {x: -20, y: -13}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &21594510\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 21594508}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 32\n    m_FontStyle: 2\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 48\n    m_Alignment: 0\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Enter Prompt Here\n--- !u!222 &21594511\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 21594508}\n  m_CullTransparentMesh: 0\n--- !u!1 &24186520\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 24186521}\n  - component: {fileID: 24186523}\n  - component: {fileID: 24186522}\n  m_Layer: 5\n  m_Name: Item Label\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &24186521\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 24186520}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 342422714}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 5, y: -0.5}\n  m_SizeDelta: {x: -30, y: -3}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &24186522\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 24186520}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 14\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 10\n    m_MaxSize: 40\n    m_Alignment: 3\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Option A\n--- !u!222 &24186523\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 24186520}\n  m_CullTransparentMesh: 1\n--- !u!1 &143266664\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 143266665}\n  - component: {fileID: 143266668}\n  - component: {fileID: 143266667}\n  - component: {fileID: 143266666}\n  m_Layer: 5\n  m_Name: Add\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &143266665\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 143266664}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0.44114578, y: 0.44114578, z: 0.44114578}\n  m_Children:\n  - {fileID: 289601564}\n  m_Father: {fileID: 734231673}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &143266666\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 143266664}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 143266667}\n  m_OnClick:\n    m_PersistentCalls:\n      m_Calls:\n      - m_Target: {fileID: 1144405788}\n        m_TargetAssemblyTypeName: OpenAi.Examples.ExampleChatRuntime, openai.api.unity\n        m_MethodName: DoAddToDialogue\n        m_Mode: 1\n        m_Arguments:\n          m_ObjectArgument: {fileID: 0}\n          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine\n          m_IntArgument: 0\n          m_FloatArgument: 0\n          m_StringArgument: \n          m_BoolArgument: 0\n        m_CallState: 2\n--- !u!114 &143266667\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 143266664}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &143266668\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 143266664}\n  m_CullTransparentMesh: 0\n--- !u!1 &280116129\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 280116130}\n  - component: {fileID: 280116133}\n  - component: {fileID: 280116132}\n  - component: {fileID: 280116131}\n  m_Layer: 5\n  m_Name: Quit\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &280116130\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0.44114578, y: 0.44114578, z: 0.44114578}\n  m_Children:\n  - {fileID: 865087086}\n  m_Father: {fileID: 734231673}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &280116131\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 280116132}\n  m_OnClick:\n    m_PersistentCalls:\n      m_Calls:\n      - m_Target: {fileID: 1144405788}\n        m_TargetAssemblyTypeName: OpenAi.Examples.ExampleChatRuntime, openai.api.unity\n        m_MethodName: QuitApp\n        m_Mode: 1\n        m_Arguments:\n          m_ObjectArgument: {fileID: 0}\n          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine\n          m_IntArgument: 0\n          m_FloatArgument: 0\n          m_StringArgument: \n          m_BoolArgument: 0\n        m_CallState: 2\n--- !u!114 &280116132\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &280116133\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_CullTransparentMesh: 0\n--- !u!1 &285536669\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 285536670}\n  - component: {fileID: 285536672}\n  - component: {fileID: 285536671}\n  m_Layer: 5\n  m_Name: Output\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &285536670\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 285536669}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1512394315}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &285536671\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 285536669}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 32\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 48\n    m_Alignment: 3\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Output\n--- !u!222 &285536672\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 285536669}\n  m_CullTransparentMesh: 0\n--- !u!1 &289601563\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 289601564}\n  - component: {fileID: 289601566}\n  - component: {fileID: 289601565}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &289601564\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 289601563}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 143266665}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &289601565\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 289601563}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Add to Dialogue\n--- !u!222 &289601566\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 289601563}\n  m_CullTransparentMesh: 0\n--- !u!1 &290938305\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 290938306}\n  - component: {fileID: 290938308}\n  - component: {fileID: 290938307}\n  m_Layer: 5\n  m_Name: Handle\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &290938306\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 290938305}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1191005547}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 0.2}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 20, y: 20}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &290938307\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 290938305}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &290938308\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 290938305}\n  m_CullTransparentMesh: 1\n--- !u!1 &342422713\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 342422714}\n  - component: {fileID: 342422715}\n  m_Layer: 5\n  m_Name: Item\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &342422714\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 342422713}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 1158409480}\n  - {fileID: 1027592577}\n  - {fileID: 24186521}\n  m_Father: {fileID: 2073891501}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0.5}\n  m_AnchorMax: {x: 1, y: 0.5}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 20}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &342422715\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 342422713}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 1158409481}\n  toggleTransition: 1\n  graphic: {fileID: 1027592578}\n  m_Group: {fileID: 0}\n  onValueChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_IsOn: 1\n--- !u!1 &358800524\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 358800527}\n  - component: {fileID: 358800526}\n  - component: {fileID: 358800525}\n  m_Layer: 0\n  m_Name: Main Camera\n  m_TagString: MainCamera\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!81 &358800525\nAudioListener:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 358800524}\n  m_Enabled: 1\n--- !u!20 &358800526\nCamera:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 358800524}\n  m_Enabled: 1\n  serializedVersion: 2\n  m_ClearFlags: 2\n  m_BackGroundColor: {r: 0, g: 0.21792704, b: 0.2830189, a: 0}\n  m_projectionMatrixMode: 1\n  m_GateFitMode: 2\n  m_FOVAxisMode: 0\n  m_SensorSize: {x: 36, y: 24}\n  m_LensShift: {x: 0, y: 0}\n  m_FocalLength: 50\n  m_NormalizedViewPortRect:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  near clip plane: 0.3\n  far clip plane: 1000\n  field of view: 60\n  orthographic: 0\n  orthographic size: 5\n  m_Depth: -1\n  m_CullingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n  m_RenderingPath: -1\n  m_TargetTexture: {fileID: 0}\n  m_TargetDisplay: 0\n  m_TargetEye: 3\n  m_HDR: 1\n  m_AllowMSAA: 1\n  m_AllowDynamicResolution: 0\n  m_ForceIntoRT: 0\n  m_OcclusionCulling: 1\n  m_StereoConvergence: 10\n  m_StereoSeparation: 0.022\n--- !u!4 &358800527\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 358800524}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 1, z: -10}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &630972316\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 630972317}\n  - component: {fileID: 630972319}\n  - component: {fileID: 630972318}\n  m_Layer: 5\n  m_Name: Label\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &630972317\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 630972316}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1984789198}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &630972318\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 630972316}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 32\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 3\n    m_MaxSize: 40\n    m_Alignment: 5\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: 'Role:'\n--- !u!222 &630972319\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 630972316}\n  m_CullTransparentMesh: 1\n--- !u!1 &638305103\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 638305107}\n  - component: {fileID: 638305106}\n  - component: {fileID: 638305105}\n  - component: {fileID: 638305104}\n  m_Layer: 5\n  m_Name: UI\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &638305104\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_IgnoreReversedGraphics: 1\n  m_BlockingObjects: 0\n  m_BlockingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n--- !u!114 &638305105\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_UiScaleMode: 1\n  m_ReferencePixelsPerUnit: 100\n  m_ScaleFactor: 1\n  m_ReferenceResolution: {x: 1920, y: 1080}\n  m_ScreenMatchMode: 0\n  m_MatchWidthOrHeight: 0\n  m_PhysicalUnit: 3\n  m_FallbackScreenDPI: 96\n  m_DefaultSpriteDPI: 96\n  m_DynamicPixelsPerUnit: 1\n  m_PresetInfoIsWorld: 0\n--- !u!223 &638305106\nCanvas:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_Enabled: 1\n  serializedVersion: 3\n  m_RenderMode: 0\n  m_Camera: {fileID: 0}\n  m_PlaneDistance: 100\n  m_PixelPerfect: 0\n  m_ReceivesEvents: 1\n  m_OverrideSorting: 0\n  m_OverridePixelPerfect: 0\n  m_SortingBucketNormalizedSize: 0\n  m_AdditionalShaderChannelsFlag: 25\n  m_SortingLayerID: 0\n  m_SortingOrder: 0\n  m_TargetDisplay: 0\n--- !u!224 &638305107\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0, y: 0, z: 0}\n  m_Children:\n  - {fileID: 1984789198}\n  - {fileID: 1512394315}\n  - {fileID: 734231673}\n  - {fileID: 2056935217}\n  m_Father: {fileID: 0}\n  m_RootOrder: 3\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0, y: 0}\n--- !u!1 &734231672\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 734231673}\n  - component: {fileID: 734231674}\n  m_Layer: 0\n  m_Name: Actions\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &734231673\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 734231672}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 2.2668242, y: 2.2668242, z: 2.2668242}\n  m_Children:\n  - {fileID: 280116130}\n  - {fileID: 1075851854}\n  - {fileID: 143266665}\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 0}\n  m_AnchorMax: {x: 0.5, y: 0}\n  m_AnchoredPosition: {x: 0, y: 89}\n  m_SizeDelta: {x: 750, y: 100}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &734231674\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 734231672}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Padding:\n    m_Left: 0\n    m_Right: 0\n    m_Top: 0\n    m_Bottom: 0\n  m_ChildAlignment: 0\n  m_StartCorner: 0\n  m_StartAxis: 0\n  m_CellSize: {x: 250, y: 100}\n  m_Spacing: {x: 0, y: 0}\n  m_Constraint: 0\n  m_ConstraintCount: 2\n--- !u!1 &803458504\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 803458505}\n  - component: {fileID: 803458508}\n  - component: {fileID: 803458507}\n  - component: {fileID: 803458506}\n  m_Layer: 5\n  m_Name: Scrollbar\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &803458505\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 803458504}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 1191005547}\n  m_Father: {fileID: 1813061924}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 1, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 20, y: 0}\n  m_Pivot: {x: 1, y: 1}\n--- !u!114 &803458506\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 803458504}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 290938307}\n  m_HandleRect: {fileID: 290938306}\n  m_Direction: 2\n  m_Value: 0\n  m_Size: 0.2\n  m_NumberOfSteps: 0\n  m_OnValueChanged:\n    m_PersistentCalls:\n      m_Calls: []\n--- !u!114 &803458507\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 803458504}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &803458508\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 803458504}\n  m_CullTransparentMesh: 1\n--- !u!1 &865087085\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 865087086}\n  - component: {fileID: 865087088}\n  - component: {fileID: 865087087}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &865087086\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 865087085}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 280116130}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &865087087\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 865087085}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Quit Application\n--- !u!222 &865087088\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 865087085}\n  m_CullTransparentMesh: 0\n--- !u!1 &895809920\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 895809921}\n  - component: {fileID: 895809924}\n  - component: {fileID: 895809923}\n  - component: {fileID: 895809922}\n  m_Layer: 5\n  m_Name: Role\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &895809921\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 895809920}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 3530427}\n  - {fileID: 1213195449}\n  - {fileID: 1813061924}\n  m_Father: {fileID: 1984789198}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &895809922\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 895809920}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 895809923}\n  m_Template: {fileID: 1813061924}\n  m_CaptionText: {fileID: 3530428}\n  m_CaptionImage: {fileID: 0}\n  m_ItemText: {fileID: 24186522}\n  m_ItemImage: {fileID: 0}\n  m_Value: 0\n  m_Options:\n    m_Options:\n    - m_Text: user\n      m_Image: {fileID: 0}\n    - m_Text: system\n      m_Image: {fileID: 0}\n    - m_Text: assistant\n      m_Image: {fileID: 0}\n  m_OnValueChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_AlphaFadeSpeed: 0.15\n--- !u!114 &895809923\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 895809920}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &895809924\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 895809920}\n  m_CullTransparentMesh: 1\n--- !u!1 &996691227\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 996691228}\n  - component: {fileID: 996691231}\n  - component: {fileID: 996691230}\n  - component: {fileID: 996691229}\n  m_Layer: 5\n  m_Name: Viewport\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &996691228\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 996691227}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 2073891501}\n  m_Father: {fileID: 1813061924}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: -18, y: 0}\n  m_Pivot: {x: 0, y: 1}\n--- !u!114 &996691229\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 996691227}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_ShowMaskGraphic: 0\n--- !u!114 &996691230\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 996691227}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &996691231\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 996691227}\n  m_CullTransparentMesh: 1\n--- !u!1 &1027592576\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1027592577}\n  - component: {fileID: 1027592579}\n  - component: {fileID: 1027592578}\n  m_Layer: 5\n  m_Name: Item Checkmark\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1027592577\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1027592576}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 342422714}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0.5}\n  m_AnchorMax: {x: 0, y: 0.5}\n  m_AnchoredPosition: {x: 10, y: 0}\n  m_SizeDelta: {x: 20, y: 20}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1027592578\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1027592576}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1027592579\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1027592576}\n  m_CullTransparentMesh: 1\n--- !u!1 &1075851853\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1075851854}\n  - component: {fileID: 1075851857}\n  - component: {fileID: 1075851856}\n  - component: {fileID: 1075851855}\n  m_Layer: 5\n  m_Name: Complete\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1075851854\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0.44114578, y: 0.44114578, z: 0.44114578}\n  m_Children:\n  - {fileID: 1986469218}\n  m_Father: {fileID: 734231673}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1075851855\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 1075851856}\n  m_OnClick:\n    m_PersistentCalls:\n      m_Calls:\n      - m_Target: {fileID: 1144405788}\n        m_TargetAssemblyTypeName: OpenAi.Examples.ExampleChatRuntime, openai.api.unity\n        m_MethodName: DoApiCompletion\n        m_Mode: 1\n        m_Arguments:\n          m_ObjectArgument: {fileID: 0}\n          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine\n          m_IntArgument: 0\n          m_FloatArgument: 0\n          m_StringArgument: \n          m_BoolArgument: 0\n        m_CallState: 2\n--- !u!114 &1075851856\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1075851857\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_CullTransparentMesh: 0\n--- !u!1 &1144405786\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1144405787}\n  - component: {fileID: 1144405788}\n  m_Layer: 0\n  m_Name: ChatCompletionExample\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!4 &1144405787\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1144405786}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!114 &1144405788\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1144405786}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: ac671c01496633846acf376026fb4b26, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  role: {fileID: 895809922}\n  Input: {fileID: 1908724338}\n  Output: {fileID: 285536671}\n--- !u!1 &1158409479\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1158409480}\n  - component: {fileID: 1158409482}\n  - component: {fileID: 1158409481}\n  m_Layer: 5\n  m_Name: Item Background\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1158409480\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1158409479}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 342422714}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1158409481\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1158409479}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 0}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1158409482\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1158409479}\n  m_CullTransparentMesh: 1\n--- !u!1 &1191005546\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1191005547}\n  m_Layer: 5\n  m_Name: Sliding Area\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1191005547\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1191005546}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 290938306}\n  m_Father: {fileID: 803458505}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: -20, y: -20}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!1 &1213195448\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1213195449}\n  - component: {fileID: 1213195451}\n  - component: {fileID: 1213195450}\n  m_Layer: 5\n  m_Name: Arrow\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1213195449\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1213195448}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 895809921}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 1, y: 0.5}\n  m_AnchorMax: {x: 1, y: 0.5}\n  m_AnchoredPosition: {x: -15, y: 0}\n  m_SizeDelta: {x: 20, y: 20}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1213195450\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1213195448}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1213195451\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1213195448}\n  m_CullTransparentMesh: 1\n--- !u!1 &1512394314\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1512394315}\n  - component: {fileID: 1512394316}\n  m_Layer: 5\n  m_Name: Chat IO\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1512394315\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1512394314}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 1908724337}\n  - {fileID: 285536670}\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 0.5}\n  m_AnchorMax: {x: 0.5, y: 0.5}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 1750, y: 750}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1512394316\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1512394314}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Padding:\n    m_Left: 0\n    m_Right: 0\n    m_Top: 0\n    m_Bottom: 0\n  m_ChildAlignment: 4\n  m_StartCorner: 0\n  m_StartAxis: 0\n  m_CellSize: {x: 1500, y: 250}\n  m_Spacing: {x: 0, y: 10}\n  m_Constraint: 0\n  m_ConstraintCount: 2\n--- !u!1 &1813061923\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1813061924}\n  - component: {fileID: 1813061927}\n  - component: {fileID: 1813061926}\n  - component: {fileID: 1813061925}\n  m_Layer: 5\n  m_Name: Template\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &1813061924\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1813061923}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 996691228}\n  - {fileID: 803458505}\n  m_Father: {fileID: 895809921}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 0}\n  m_AnchoredPosition: {x: 0, y: 2}\n  m_SizeDelta: {x: 0, y: 150}\n  m_Pivot: {x: 0.5, y: 1}\n--- !u!114 &1813061925\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1813061923}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Content: {fileID: 2073891501}\n  m_Horizontal: 0\n  m_Vertical: 1\n  m_MovementType: 2\n  m_Elasticity: 0.1\n  m_Inertia: 1\n  m_DecelerationRate: 0.135\n  m_ScrollSensitivity: 1\n  m_Viewport: {fileID: 996691228}\n  m_HorizontalScrollbar: {fileID: 0}\n  m_VerticalScrollbar: {fileID: 803458506}\n  m_HorizontalScrollbarVisibility: 0\n  m_VerticalScrollbarVisibility: 2\n  m_HorizontalScrollbarSpacing: 0\n  m_VerticalScrollbarSpacing: -3\n  m_OnValueChanged:\n    m_PersistentCalls:\n      m_Calls: []\n--- !u!114 &1813061926\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1813061923}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1813061927\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1813061923}\n  m_CullTransparentMesh: 1\n--- !u!1001 &1894887618\nPrefabInstance:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_Modification:\n    m_TransformParent: {fileID: 0}\n    m_Modifications:\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_RootOrder\n      value: 2\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalPosition.x\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalPosition.y\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalPosition.z\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalRotation.w\n      value: 1\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalRotation.x\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalRotation.y\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalRotation.z\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalEulerAnglesHint.x\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalEulerAnglesHint.y\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2458975999970266705, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_LocalEulerAnglesHint.z\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2692144715385115182, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: Model\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 2692144715385115183, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n      propertyPath: m_Name\n      value: OpenAiChatCompleterV1\n      objectReference: {fileID: 0}\n    m_RemovedComponents: []\n  m_SourcePrefab: {fileID: 100100000, guid: 4e6ec076fabc0494db4fa5402d517a9f, type: 3}\n--- !u!1 &1908724336\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1908724337}\n  - component: {fileID: 1908724340}\n  - component: {fileID: 1908724339}\n  - component: {fileID: 1908724338}\n  m_Layer: 5\n  m_Name: Input\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1908724337\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 21594509}\n  - {fileID: 2129249664}\n  m_Father: {fileID: 1512394315}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1908724338\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_WrapAround: 0\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 1908724339}\n  m_TextComponent: {fileID: 2129249665}\n  m_Placeholder: {fileID: 21594510}\n  m_ContentType: 0\n  m_InputType: 0\n  m_AsteriskChar: 42\n  m_KeyboardType: 0\n  m_LineType: 0\n  m_HideMobileInput: 0\n  m_CharacterValidation: 0\n  m_CharacterLimit: 0\n  m_OnEndEdit:\n    m_PersistentCalls:\n      m_Calls: []\n  m_OnValueChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_CustomCaretColor: 0\n  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}\n  m_Text: \n  m_CaretBlinkRate: 0.85\n  m_CaretWidth: 1\n  m_ReadOnly: 0\n  m_ShouldActivateOnSelect: 1\n--- !u!114 &1908724339\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1908724340\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_CullTransparentMesh: 0\n--- !u!1 &1984789197\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1984789198}\n  - component: {fileID: 1984789199}\n  m_Layer: 5\n  m_Name: Choose Role\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1984789198\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1984789197}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 630972317}\n  - {fileID: 895809921}\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 1}\n  m_AnchorMax: {x: 0.5, y: 1}\n  m_AnchoredPosition: {x: -87.5, y: -114.5}\n  m_SizeDelta: {x: 550, y: 150}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1984789199\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1984789197}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Padding:\n    m_Left: 0\n    m_Right: 0\n    m_Top: 0\n    m_Bottom: 0\n  m_ChildAlignment: 4\n  m_StartCorner: 0\n  m_StartAxis: 0\n  m_CellSize: {x: 250, y: 75}\n  m_Spacing: {x: 10, y: 0}\n  m_Constraint: 0\n  m_ConstraintCount: 2\n--- !u!1 &1986469217\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1986469218}\n  - component: {fileID: 1986469220}\n  - component: {fileID: 1986469219}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1986469218\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1986469217}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1075851854}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1986469219\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1986469217}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Attempt Completion\n--- !u!222 &1986469220\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1986469217}\n  m_CullTransparentMesh: 0\n--- !u!1 &2056935214\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 2056935217}\n  - component: {fileID: 2056935216}\n  - component: {fileID: 2056935215}\n  m_Layer: 0\n  m_Name: EventSystem\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &2056935215\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2056935214}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_HorizontalAxis: Horizontal\n  m_VerticalAxis: Vertical\n  m_SubmitButton: Submit\n  m_CancelButton: Cancel\n  m_InputActionsPerSecond: 10\n  m_RepeatDelay: 0.5\n  m_ForceModuleActive: 0\n--- !u!114 &2056935216\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2056935214}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_FirstSelected: {fileID: 0}\n  m_sendNavigationEvents: 1\n  m_DragThreshold: 10\n--- !u!4 &2056935217\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2056935214}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: -960, y: -540, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 3\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &2073891500\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 2073891501}\n  m_Layer: 5\n  m_Name: Content\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &2073891501\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2073891500}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 342422714}\n  m_Father: {fileID: 996691228}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 1}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 28}\n  m_Pivot: {x: 0.5, y: 1}\n--- !u!1 &2129249663\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 2129249664}\n  - component: {fileID: 2129249666}\n  - component: {fileID: 2129249665}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &2129249664\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2129249663}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1908724337}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -0.5}\n  m_SizeDelta: {x: -20, y: -13}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &2129249665\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2129249663}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 32\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 48\n    m_Alignment: 0\n    m_AlignByGeometry: 0\n    m_RichText: 0\n    m_HorizontalOverflow: 1\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: \n--- !u!222 &2129249666\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2129249663}\n  m_CullTransparentMesh: 0\n"
  },
  {
    "path": "Runtime/Scenes/ExampleChatRuntimeScene.unity.meta",
    "content": "fileFormatVersion: 2\nguid: 0d4eb4ed72ff417418747843458b9fd2\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scenes/ExampleOpenAiApiRuntimeScene.unity",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!29 &1\nOcclusionCullingSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_OcclusionBakeSettings:\n    smallestOccluder: 5\n    smallestHole: 0.25\n    backfaceThreshold: 100\n  m_SceneGUID: 00000000000000000000000000000000\n  m_OcclusionCullingData: {fileID: 0}\n--- !u!104 &2\nRenderSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 9\n  m_Fog: 0\n  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}\n  m_FogMode: 3\n  m_FogDensity: 0.01\n  m_LinearFogStart: 0\n  m_LinearFogEnd: 300\n  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}\n  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}\n  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}\n  m_AmbientIntensity: 1\n  m_AmbientMode: 0\n  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}\n  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}\n  m_HaloStrength: 0.5\n  m_FlareStrength: 1\n  m_FlareFadeSpeed: 3\n  m_HaloTexture: {fileID: 0}\n  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}\n  m_DefaultReflectionMode: 0\n  m_DefaultReflectionResolution: 128\n  m_ReflectionBounces: 1\n  m_ReflectionIntensity: 1\n  m_CustomReflection: {fileID: 0}\n  m_Sun: {fileID: 0}\n  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}\n  m_UseRadianceAmbientProbe: 0\n--- !u!157 &3\nLightmapSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 11\n  m_GIWorkflowMode: 1\n  m_GISettings:\n    serializedVersion: 2\n    m_BounceScale: 1\n    m_IndirectOutputScale: 1\n    m_AlbedoBoost: 1\n    m_EnvironmentLightingMode: 0\n    m_EnableBakedLightmaps: 1\n    m_EnableRealtimeLightmaps: 0\n  m_LightmapEditorSettings:\n    serializedVersion: 12\n    m_Resolution: 2\n    m_BakeResolution: 40\n    m_AtlasSize: 1024\n    m_AO: 0\n    m_AOMaxDistance: 1\n    m_CompAOExponent: 1\n    m_CompAOExponentDirect: 0\n    m_ExtractAmbientOcclusion: 0\n    m_Padding: 2\n    m_LightmapParameters: {fileID: 0}\n    m_LightmapsBakeMode: 1\n    m_TextureCompression: 1\n    m_FinalGather: 0\n    m_FinalGatherFiltering: 1\n    m_FinalGatherRayCount: 256\n    m_ReflectionCompression: 2\n    m_MixedBakeMode: 2\n    m_BakeBackend: 1\n    m_PVRSampling: 1\n    m_PVRDirectSampleCount: 32\n    m_PVRSampleCount: 512\n    m_PVRBounces: 2\n    m_PVREnvironmentSampleCount: 256\n    m_PVREnvironmentReferencePointCount: 2048\n    m_PVRFilteringMode: 1\n    m_PVRDenoiserTypeDirect: 1\n    m_PVRDenoiserTypeIndirect: 1\n    m_PVRDenoiserTypeAO: 1\n    m_PVRFilterTypeDirect: 0\n    m_PVRFilterTypeIndirect: 0\n    m_PVRFilterTypeAO: 0\n    m_PVREnvironmentMIS: 1\n    m_PVRCulling: 1\n    m_PVRFilteringGaussRadiusDirect: 1\n    m_PVRFilteringGaussRadiusIndirect: 5\n    m_PVRFilteringGaussRadiusAO: 2\n    m_PVRFilteringAtrousPositionSigmaDirect: 0.5\n    m_PVRFilteringAtrousPositionSigmaIndirect: 2\n    m_PVRFilteringAtrousPositionSigmaAO: 1\n    m_ExportTrainingData: 0\n    m_TrainingDataDestination: TrainingData\n    m_LightProbeSampleCountMultiplier: 4\n  m_LightingDataAsset: {fileID: 0}\n  m_UseShadowmask: 1\n--- !u!196 &4\nNavMeshSettings:\n  serializedVersion: 2\n  m_ObjectHideFlags: 0\n  m_BuildSettings:\n    serializedVersion: 2\n    agentTypeID: 0\n    agentRadius: 0.5\n    agentHeight: 2\n    agentSlope: 45\n    agentClimb: 0.4\n    ledgeDropHeight: 0\n    maxJumpAcrossDistance: 0\n    minRegionArea: 2\n    manualCellSize: 0\n    cellSize: 0.16666667\n    manualTileSize: 0\n    tileSize: 256\n    accuratePlacement: 0\n    debug:\n      m_Flags: 0\n  m_NavMeshData: {fileID: 0}\n--- !u!1 &21594508\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 21594509}\n  - component: {fileID: 21594511}\n  - component: {fileID: 21594510}\n  m_Layer: 5\n  m_Name: Placeholder\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &21594509\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 21594508}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1908724337}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -0.5}\n  m_SizeDelta: {x: -20, y: -13}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &21594510\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 21594508}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 2\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 0\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Enter Prompt Here\n--- !u!222 &21594511\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 21594508}\n  m_CullTransparentMesh: 0\n--- !u!1001 &127665943\nPrefabInstance:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_Modification:\n    m_TransformParent: {fileID: 0}\n    m_Modifications:\n    - target: {fileID: 8905070302076984395, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_Name\n      value: OpenAiCompleterV1\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_RootOrder\n      value: 1\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalPosition.x\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalPosition.y\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalPosition.z\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalRotation.w\n      value: 1\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalRotation.x\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalRotation.y\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalRotation.z\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalEulerAnglesHint.x\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalEulerAnglesHint.y\n      value: 0\n      objectReference: {fileID: 0}\n    - target: {fileID: 9000805303073374261, guid: f28446e696573d2418d2a68633c4a3b3,\n        type: 3}\n      propertyPath: m_LocalEulerAnglesHint.z\n      value: 0\n      objectReference: {fileID: 0}\n    m_RemovedComponents: []\n  m_SourcePrefab: {fileID: 100100000, guid: f28446e696573d2418d2a68633c4a3b3, type: 3}\n--- !u!1 &280116129\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 280116130}\n  - component: {fileID: 280116133}\n  - component: {fileID: 280116132}\n  - component: {fileID: 280116131}\n  m_Layer: 5\n  m_Name: Button_Quit\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &280116130\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 865087086}\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 3\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 0.5}\n  m_AnchorMax: {x: 0.5, y: 0.5}\n  m_AnchoredPosition: {x: 0, y: -470}\n  m_SizeDelta: {x: 200, y: 60}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &280116131\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 280116132}\n  m_OnClick:\n    m_PersistentCalls:\n      m_Calls:\n      - m_Target: {fileID: 1144405788}\n        m_MethodName: QuitApp\n        m_Mode: 1\n        m_Arguments:\n          m_ObjectArgument: {fileID: 0}\n          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine\n          m_IntArgument: 0\n          m_FloatArgument: 0\n          m_StringArgument: \n          m_BoolArgument: 0\n        m_CallState: 2\n--- !u!114 &280116132\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &280116133\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 280116129}\n  m_CullTransparentMesh: 0\n--- !u!1 &285536669\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 285536670}\n  - component: {fileID: 285536672}\n  - component: {fileID: 285536671}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &285536670\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 285536669}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 0.5}\n  m_AnchorMax: {x: 0.5, y: 0.5}\n  m_AnchoredPosition: {x: 0, y: -300}\n  m_SizeDelta: {x: 1000, y: 102}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &285536671\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 285536669}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Output\n--- !u!222 &285536672\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 285536669}\n  m_CullTransparentMesh: 0\n--- !u!1 &358800524\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 358800527}\n  - component: {fileID: 358800526}\n  - component: {fileID: 358800525}\n  m_Layer: 0\n  m_Name: Main Camera\n  m_TagString: MainCamera\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!81 &358800525\nAudioListener:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 358800524}\n  m_Enabled: 1\n--- !u!20 &358800526\nCamera:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 358800524}\n  m_Enabled: 1\n  serializedVersion: 2\n  m_ClearFlags: 2\n  m_BackGroundColor: {r: 0, g: 0.21792704, b: 0.2830189, a: 0}\n  m_projectionMatrixMode: 1\n  m_GateFitMode: 2\n  m_FOVAxisMode: 0\n  m_SensorSize: {x: 36, y: 24}\n  m_LensShift: {x: 0, y: 0}\n  m_FocalLength: 50\n  m_NormalizedViewPortRect:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  near clip plane: 0.3\n  far clip plane: 1000\n  field of view: 60\n  orthographic: 0\n  orthographic size: 5\n  m_Depth: -1\n  m_CullingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n  m_RenderingPath: -1\n  m_TargetTexture: {fileID: 0}\n  m_TargetDisplay: 0\n  m_TargetEye: 3\n  m_HDR: 1\n  m_AllowMSAA: 1\n  m_AllowDynamicResolution: 0\n  m_ForceIntoRT: 0\n  m_OcclusionCulling: 1\n  m_StereoConvergence: 10\n  m_StereoSeparation: 0.022\n--- !u!4 &358800527\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 358800524}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 1, z: -10}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &638305103\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 638305107}\n  - component: {fileID: 638305106}\n  - component: {fileID: 638305105}\n  - component: {fileID: 638305104}\n  m_Layer: 5\n  m_Name: Canvas\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &638305104\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_IgnoreReversedGraphics: 1\n  m_BlockingObjects: 0\n  m_BlockingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n--- !u!114 &638305105\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_UiScaleMode: 1\n  m_ReferencePixelsPerUnit: 100\n  m_ScaleFactor: 1\n  m_ReferenceResolution: {x: 1920, y: 1080}\n  m_ScreenMatchMode: 0\n  m_MatchWidthOrHeight: 0\n  m_PhysicalUnit: 3\n  m_FallbackScreenDPI: 96\n  m_DefaultSpriteDPI: 96\n  m_DynamicPixelsPerUnit: 1\n--- !u!223 &638305106\nCanvas:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_Enabled: 1\n  serializedVersion: 3\n  m_RenderMode: 0\n  m_Camera: {fileID: 0}\n  m_PlaneDistance: 100\n  m_PixelPerfect: 0\n  m_ReceivesEvents: 1\n  m_OverrideSorting: 0\n  m_OverridePixelPerfect: 0\n  m_SortingBucketNormalizedSize: 0\n  m_AdditionalShaderChannelsFlag: 0\n  m_SortingLayerID: 0\n  m_SortingOrder: 0\n  m_TargetDisplay: 0\n--- !u!224 &638305107\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 638305103}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0, y: 0, z: 0}\n  m_Children:\n  - {fileID: 1908724337}\n  - {fileID: 1075851854}\n  - {fileID: 285536670}\n  - {fileID: 280116130}\n  m_Father: {fileID: 0}\n  m_RootOrder: 3\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0, y: 0}\n--- !u!1 &865087085\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 865087086}\n  - component: {fileID: 865087088}\n  - component: {fileID: 865087087}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &865087086\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 865087085}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 280116130}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &865087087\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 865087085}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Quit Application\n--- !u!222 &865087088\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 865087085}\n  m_CullTransparentMesh: 0\n--- !u!1 &1075851853\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1075851854}\n  - component: {fileID: 1075851857}\n  - component: {fileID: 1075851856}\n  - component: {fileID: 1075851855}\n  m_Layer: 5\n  m_Name: Button_Completion\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1075851854\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 1986469218}\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 0.5}\n  m_AnchorMax: {x: 0.5, y: 0.5}\n  m_AnchoredPosition: {x: 0, y: -62}\n  m_SizeDelta: {x: 200, y: 60}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1075851855\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 1075851856}\n  m_OnClick:\n    m_PersistentCalls:\n      m_Calls:\n      - m_Target: {fileID: 1144405788}\n        m_MethodName: DoApiCompletion\n        m_Mode: 1\n        m_Arguments:\n          m_ObjectArgument: {fileID: 0}\n          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine\n          m_IntArgument: 0\n          m_FloatArgument: 0\n          m_StringArgument: \n          m_BoolArgument: 0\n        m_CallState: 2\n--- !u!114 &1075851856\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1075851857\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1075851853}\n  m_CullTransparentMesh: 0\n--- !u!1 &1144405786\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1144405787}\n  - component: {fileID: 1144405788}\n  m_Layer: 0\n  m_Name: CompletionExample\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!4 &1144405787\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1144405786}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!114 &1144405788\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1144405786}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 0dffa08172edd254b9cd939b09f211a0, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  Input: {fileID: 1908724338}\n  Output: {fileID: 285536671}\n--- !u!1 &1908724336\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1908724337}\n  - component: {fileID: 1908724340}\n  - component: {fileID: 1908724339}\n  - component: {fileID: 1908724338}\n  m_Layer: 5\n  m_Name: Input\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1908724337\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 21594509}\n  - {fileID: 2129249664}\n  m_Father: {fileID: 638305107}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0.5, y: 0.5}\n  m_AnchorMax: {x: 0.5, y: 0.5}\n  m_AnchoredPosition: {x: 0, y: 100}\n  m_SizeDelta: {x: 1000, y: 120}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1908724338\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Navigation:\n    m_Mode: 3\n    m_SelectOnUp: {fileID: 0}\n    m_SelectOnDown: {fileID: 0}\n    m_SelectOnLeft: {fileID: 0}\n    m_SelectOnRight: {fileID: 0}\n  m_Transition: 1\n  m_Colors:\n    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}\n    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}\n    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}\n    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}\n    m_ColorMultiplier: 1\n    m_FadeDuration: 0.1\n  m_SpriteState:\n    m_HighlightedSprite: {fileID: 0}\n    m_PressedSprite: {fileID: 0}\n    m_SelectedSprite: {fileID: 0}\n    m_DisabledSprite: {fileID: 0}\n  m_AnimationTriggers:\n    m_NormalTrigger: Normal\n    m_HighlightedTrigger: Highlighted\n    m_PressedTrigger: Pressed\n    m_SelectedTrigger: Selected\n    m_DisabledTrigger: Disabled\n  m_Interactable: 1\n  m_TargetGraphic: {fileID: 1908724339}\n  m_TextComponent: {fileID: 2129249665}\n  m_Placeholder: {fileID: 21594510}\n  m_ContentType: 0\n  m_InputType: 0\n  m_AsteriskChar: 42\n  m_KeyboardType: 0\n  m_LineType: 0\n  m_HideMobileInput: 0\n  m_CharacterValidation: 0\n  m_CharacterLimit: 0\n  m_OnEndEdit:\n    m_PersistentCalls:\n      m_Calls: []\n  m_OnValueChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_CustomCaretColor: 0\n  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}\n  m_Text: \n  m_CaretBlinkRate: 0.85\n  m_CaretWidth: 1\n  m_ReadOnly: 0\n--- !u!114 &1908724339\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}\n  m_Type: 1\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1908724340\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1908724336}\n  m_CullTransparentMesh: 0\n--- !u!1 &1986469217\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1986469218}\n  - component: {fileID: 1986469220}\n  - component: {fileID: 1986469219}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1986469218\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1986469217}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1075851854}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1986469219\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1986469217}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 4\n    m_AlignByGeometry: 0\n    m_RichText: 1\n    m_HorizontalOverflow: 0\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: Attempt Completion\n--- !u!222 &1986469220\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1986469217}\n  m_CullTransparentMesh: 0\n--- !u!1 &2056935214\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 2056935217}\n  - component: {fileID: 2056935216}\n  - component: {fileID: 2056935215}\n  m_Layer: 0\n  m_Name: EventSystem\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &2056935215\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2056935214}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_HorizontalAxis: Horizontal\n  m_VerticalAxis: Vertical\n  m_SubmitButton: Submit\n  m_CancelButton: Cancel\n  m_InputActionsPerSecond: 10\n  m_RepeatDelay: 0.5\n  m_ForceModuleActive: 0\n--- !u!114 &2056935216\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2056935214}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_FirstSelected: {fileID: 0}\n  m_sendNavigationEvents: 1\n  m_DragThreshold: 10\n--- !u!4 &2056935217\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2056935214}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 4\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &2129249663\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 2129249664}\n  - component: {fileID: 2129249666}\n  - component: {fileID: 2129249665}\n  m_Layer: 5\n  m_Name: Text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &2129249664\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2129249663}\n  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1908724337}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -0.5}\n  m_SizeDelta: {x: -20, y: -13}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &2129249665\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2129249663}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}\n  m_RaycastTarget: 1\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_FontData:\n    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}\n    m_FontSize: 24\n    m_FontStyle: 0\n    m_BestFit: 0\n    m_MinSize: 2\n    m_MaxSize: 40\n    m_Alignment: 0\n    m_AlignByGeometry: 0\n    m_RichText: 0\n    m_HorizontalOverflow: 1\n    m_VerticalOverflow: 0\n    m_LineSpacing: 1\n  m_Text: \n--- !u!222 &2129249666\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2129249663}\n  m_CullTransparentMesh: 0\n"
  },
  {
    "path": "Runtime/Scenes/ExampleOpenAiApiRuntimeScene.unity.meta",
    "content": "fileFormatVersion: 2\nguid: 725f21f739d61fd47829ba2893d9c60f\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scenes.meta",
    "content": "fileFormatVersion: 2\nguid: 8439a2f9f61f4044dadc2eba83e4b910\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Base/AApiResource.cs",
    "content": "using OpenAi.Json;\n\nusing System;\nusing System.Collections;\nusing System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// An api resource represents some api endpoint with a specific function. An \n    /// example of an api resource is  https://api.openai.com/v1/engines. Each resource\n    /// endpoint can have different functionity based on the HTTP method used (GET, POST, etc.)\n    /// and the parameters provided in the request body. \n    /// </summary>\n    public abstract class AApiResource<TParent> : IApiResource\n        where TParent : IApiResource\n    {\n        private StringBuilder _sb = new StringBuilder();\n\n        /// <inheritdoc />\n        public IApiResource ParentResource { get; }\n\n        /// <inheritdoc />\n        public abstract string Endpoint { get; }\n\n        /// <inheritdoc />\n        public void PopulateAuthHeaders(UnityWebRequest client) => ParentResource.PopulateAuthHeaders(client);\n\n        /// <inheritdoc />\n        public string Url\n        {\n            get\n            {\n                _sb.Clear();\n                ConstructEndpoint(_sb);\n                return _sb.ToString();\n            }\n        }\n\n        /// <summary>\n        /// Create a resource with a parent. Depending on how the api is\n        /// architected, parents can provide common pieces of the api endpoints\n        /// to their children. For example, https://api.openai.com/v1 could be\n        /// represented by <see cref=\"OpenAiApiV1\"/> with a child of <see cref=\"EnginesResourceV1\"/>\n        /// to represent https://api.openai.com/v1/engines\n        /// </summary>\n        public AApiResource(TParent parent)\n        {\n            ParentResource = parent;\n        }\n\n        /// <inheritdoc />\n        public void ConstructEndpoint(StringBuilder sb)\n        {\n            ParentResource.ConstructEndpoint(sb);\n            sb.Append(Endpoint);\n        }\n\n        #region GET\n        /// <summary>\n        /// Implements an async get request\n        /// </summary>\n        protected async Task<ApiResult<TResponse>> GetAsync<TResponse>()\n            where TResponse : AModelV1, new()\n        {\n            UnityWebRequest response = await GetRequestAsync();\n            return PackResult<TResponse>(response);\n        }\n\n        /// <summary>\n        /// Implements a get request as a Coroutine\n        /// </summary>\n        protected Coroutine GetCoroutine<TResponse>(MonoBehaviour mono, Action<ApiResult<TResponse>> onResult)\n            where TResponse : AModelV1, new()\n        {\n            return mono.StartCoroutine(GetRoutine());\n\n            IEnumerator GetRoutine()\n            {\n                UnityWebRequest response = null;\n                yield return mono.StartCoroutine(GetRequestCoroutine((res) => response = res));\n                if (response == null) onResult(new ApiResult<TResponse>() { IsSuccess = false });\n\n                ApiResult<TResponse> result = PackResult<TResponse>(response);\n\n                if (result == null) onResult(new ApiResult<TResponse>() { IsSuccess = false });\n                else onResult(result);\n            }\n        }\n        #endregion\n\n        #region DELETE\n        /// <summary>\n        /// Implements an async get request\n        /// </summary>\n        protected async Task<ApiResult> DeleteAsync()\n        {\n            UnityWebRequest response = await DeleteRequestAsync();\n            return PackResult_RequestOnly(response);\n        }\n\n        /// <summary>\n        /// Implements a get request as a Coroutine\n        /// </summary>\n        protected Coroutine DeleteCoroutine(MonoBehaviour mono, Action<ApiResult> onResult)\n        {\n            return mono.StartCoroutine(DeleteRoutine());\n\n            IEnumerator DeleteRoutine()\n            {\n                UnityWebRequest response = null;\n                yield return mono.StartCoroutine(DeleteRequestCoroutine((res) => response = res));\n                if (response == null) onResult(new ApiResult() { IsSuccess = false });\n\n                ApiResult result = PackResult_RequestOnly(response);\n\n                if (result == null) onResult(new ApiResult() { IsSuccess = false });\n                else onResult(result);\n            }\n        }\n        #endregion\n\n        #region POST\n        /// <summary>\n        /// Implements an async post request\n        /// </summary>\n        protected async Task<ApiResult<TResponse>> PostAsync<TRequest, TResponse>(TRequest request)\n            where TRequest : AModelV1, new()\n            where TResponse : AModelV1, new()\n        {\n            UnityWebRequest response = await PostRequestAsync(request);\n            return PackResult<TResponse>(response);\n        }\n\n        /// <summary>\n        /// Implements a post request as a coroutine\n        /// </summary>\n        /// <returns></returns>\n        protected Coroutine PostCoroutine<TRequest, TResponse>(MonoBehaviour mono, TRequest request, Action<ApiResult<TResponse>> onResult)\n            where TRequest : AModelV1, new()\n            where TResponse : AModelV1, new()\n        {\n            return mono.StartCoroutine(PostRoutine());\n\n            IEnumerator PostRoutine()\n            {\n                UnityWebRequest response = null;\n                yield return mono.StartCoroutine(PostRequestCoroutine(request, (res) => response = res));\n                if (response == null) onResult(new ApiResult<TResponse>() { IsSuccess = false });\n\n                ApiResult<TResponse> result = PackResult<TResponse>(response);\n                if (result == null) onResult(new ApiResult<TResponse>() { IsSuccess = false });\n                else onResult(result);\n            }\n        }\n        #endregion\n\n        #region POST Event Stream\n        /// <summary>\n        /// Implements an async post request, with the reception method as event streams <see href=\"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\"/>\n        /// </summary>\n        protected async Task PostAsync_EventStream<TRequest, TResponse>(TRequest request, Action<ApiResult<TResponse>> onRequestStatus, Action<int, TResponse> onPartialResult, Action onCompletion = null)\n            where TRequest : AModelV1, new()\n            where TResponse : AModelV1, new()\n        {\n            UnityWebRequest response = await PostRequestAsync(request);\n            \n            ApiResult<TResponse> status = new ApiResult<TResponse>() { IsSuccess = response.result == UnityWebRequest.Result.Success, HttpResponse = response };\n            onRequestStatus(status);\n            \n            if (response.result == UnityWebRequest.Result.Success) await ReadEventStreamAsync(response, onPartialResult, onCompletion);\n        }\n\n        /// <summary>\n        /// Implements a post request as a coroutine, with the reception method as event streams <see href=\"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\"/>\n        /// </summary>\n        /// <returns></returns>\n        protected Coroutine PostCoroutine_EventStream<TRequest, TResponse>(MonoBehaviour mono, TRequest request, Action<ApiResult<TResponse>> onRequestStatus, Action<int, TResponse> onPartialResult, Action onCompletion = null)\n            where TRequest : AModelV1, new()\n            where TResponse : AModelV1, new()\n        {\n            return mono.StartCoroutine(PostEventStreamRoutine());\n\n            IEnumerator PostEventStreamRoutine()\n            {\n                UnityWebRequest response = null;\n                yield return mono.StartCoroutine(PostRequestCoroutine(request, (res) => response = res));\n\n                if (response == null) onRequestStatus(new ApiResult<TResponse>() { IsSuccess = false });\n                else onRequestStatus(new ApiResult<TResponse>() { IsSuccess = response.result == UnityWebRequest.Result.Success, HttpResponse = response });\n\n                if (response != null && response.result == UnityWebRequest.Result.Success)\n                {\n                    Task ReadStreamTask = ReadEventStreamAsync(response, onPartialResult, onCompletion);\n                    while (!ReadStreamTask.IsCompleted) yield return new WaitForEndOfFrame();\n                }\n            }\n        }\n        #endregion\n\n        private async Task<UnityWebRequest> PostRequestAsync<TRequest>(TRequest request)\n            where TRequest : AModelV1, new()\n        {\n            UnityWebRequest client =\n#if UNITY_2022_2_OR_NEWER\n                UnityWebRequest.PostWwwForm(Url, string.Empty);\n#else\n                UnityWebRequest.Post(Url, string.Empty);\n#endif\n            ParentResource.PopulateAuthHeaders(client);\n\n            AddJsonToUnityWebRequest(client, request.ToJson());\n\n            await client.SendWebRequest();\n            client.uploadHandler.Dispose();\n            return client;\n        }\n\n        private async Task<UnityWebRequest> GetRequestAsync()\n        {\n            UnityWebRequest client = UnityWebRequest.Get(Url);\n            ParentResource.PopulateAuthHeaders(client);\n            await client.SendWebRequest();\n            return client;\n        }\n\n        private async Task<UnityWebRequest> DeleteRequestAsync()\n        {\n            UnityWebRequest client = UnityWebRequest.Delete(Url);\n            ParentResource.PopulateAuthHeaders(client);\n            await client.SendWebRequest();\n            return client;\n        }\n\n        private async Task ReadEventStreamAsync<TResponse>(UnityWebRequest response, Action<int, TResponse> onPartialResult, Action onCompletion)\n            where TResponse : AModelV1, new()\n        {\n            using (Stream stream = new MemoryStream(response.downloadHandler.data))\n            {\n                int index = 0;\n\n                using (StreamReader reader = new StreamReader(stream))\n                {\n                    string line;\n                    while ((line = await reader.ReadLineAsync()) != null)\n                    {\n                        if (line.StartsWith(\"data: \")) line = line.Substring(\"data: \".Length);\n\n                        if (line == \"[DONE]\")\n                        {\n                            if(onCompletion != null) onCompletion();\n                            return;\n                        }\n                        else if (!string.IsNullOrWhiteSpace(line))\n                        {\n                            index++;\n                            JsonObject obj = JsonDeserializer.FromJson(line.Trim());\n                            TResponse streamedResult = new TResponse();\n                            streamedResult.FromJson(obj);\n\n                            onPartialResult(index, streamedResult);\n                        }\n                    }\n                }\n            }\n        }\n\n        private IEnumerator PostRequestCoroutine<TRequest>(TRequest request, Action<UnityWebRequest> onResponse)\n            where TRequest : AModelV1, new()\n        {\n            Task<UnityWebRequest> responseTask = PostRequestAsync(request);\n            while (!responseTask.IsCompleted) yield return new WaitForEndOfFrame();\n            UnityWebRequest response = responseTask.Result;\n            onResponse(response);\n        }\n\n        private IEnumerator GetRequestCoroutine(Action<UnityWebRequest> onResponse)\n        {\n            Task<UnityWebRequest> responseTask = GetRequestAsync();\n            while (!responseTask.IsCompleted) yield return new WaitForEndOfFrame();\n            UnityWebRequest response = responseTask.Result;\n            onResponse(response);\n        }\n\n        private IEnumerator DeleteRequestCoroutine(Action<UnityWebRequest> onResponse)\n        {\n            Task<UnityWebRequest> responseTask = DeleteRequestAsync();\n            while (!responseTask.IsCompleted) yield return new WaitForEndOfFrame();\n            UnityWebRequest response = responseTask.Result;\n            onResponse(response);\n        }\n\n\n        private ApiResult<TResponse> PackResult<TResponse>(UnityWebRequest response)\n            where TResponse : AModelV1, new()\n        {\n            ApiResult<TResponse> result = new ApiResult<TResponse>()\n            {\n                IsSuccess = response.result == UnityWebRequest.Result.Success,\n                HttpResponse = response\n            };\n\n            if (result.IsSuccess)\n            {\n                string resultAsString = response.downloadHandler.text;\n                result.Result = UnpackResponseObject<TResponse>(resultAsString);\n            }\n\n            return result;\n        }\n\n        private ApiResult PackResult_RequestOnly(UnityWebRequest response)\n        {\n            ApiResult result = new ApiResult()\n            {\n                IsSuccess = response.result == UnityWebRequest.Result.Success,\n                HttpResponse = response\n            };\n\n            return result;\n        }\n\n        private void AddJsonToUnityWebRequest(UnityWebRequest client, string json)\n        {\n            client.SetRequestHeader(\"Content-Type\", \"application/json\");\n            client.uploadHandler = new UploadHandlerRaw(\n                Encoding.UTF8.GetBytes(json)\n            );\n        }\n\n        private TModel UnpackResponseObject<TModel>(string content)\n            where TModel : AModelV1, new()\n        {\n            JsonObject obj = JsonDeserializer.FromJson(content);\n            TModel res = new TModel();\n            res.FromJson(obj);\n            return res;\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Base/AApiResource.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e39588fc3ace7674abd12ac0f6d7b8a8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Base/ApiResult.cs",
    "content": "﻿using UnityEngine.Networking;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A result of an api call\n    /// </summary>\n    public class ApiResult\n    {\n        /// <summary>\n        /// True if the request status is a success code\n        /// </summary>\n        public bool IsSuccess;\n\n        /// <summary>\n        /// The completed <see cref=\"UnityWebRequest\"/>\n        /// </summary>\n        public UnityWebRequest HttpResponse;\n    }\n\n    /// <summary>\n    /// A result of an api call\n    /// </summary>\n    /// <typeparam name=\"TResult\">The type of result expected from the api call</typeparam>\n    public class ApiResult<TResult> : ApiResult\n    {\n        /// <summary>\n        /// The deserailized response from the call. Null if no repsonse received or call unsuccessful.\n        /// </summary>\n        public TResult Result;\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Base/ApiResult.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0fa1c3e1c2e076e41abbd23c265754aa\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Base/IApiResource.cs",
    "content": "using System.Text;\n\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Represents an API endpoint\n    /// </summary>\n    public interface IApiResource\n    {\n        /// <summary>\n        /// The parent resource object. Null if root.\n        /// </summary>\n        IApiResource ParentResource { get; }\n\n        /// <summary>\n        /// The url endpoint of the resource.\n        /// </summary>\n        string Endpoint { get; }\n\n        /// <summary>\n        /// The full constucted url to the endpoint\n        /// </summary>\n        string Url { get; }\n\n        /// <summary>\n        /// The endpoint is constructed by passing a <see cref=\"StringBuilder\"/> up\n        /// the tree until the parent is reached. The Parent then adds it's portion\n        /// of the endpoint. The first child contributes it's portion, and so on. Until\n        /// the whole endpoint is created.\n        /// </summary>\n        void ConstructEndpoint(StringBuilder sb);\n\n        /// <summary>\n        /// Populates a <see cref=\"UnityWebRequest\"/> with the appropriate auth headers\n        /// </summary>\n        /// <returns></returns>\n        void PopulateAuthHeaders(UnityWebRequest client);\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Base/IApiResource.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8eda116edf0387a44b2d3d67d0894770\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Base/OpenAiApiException.cs",
    "content": "﻿using System;\n\nusing UnityEngine;\nusing Object = UnityEngine.Object;\n\nnamespace OpenAi.Api\n{\n    /// <summary>\n    /// Exception that occurs when OpenAiApi calls fail\n    /// </summary>\n    public class OpenAiApiException : Exception\n    {\n        /// <summary>\n        /// The context of the failed api call\n        /// </summary>\n        public Object Context { get; private set; }\n\n        /// <summary>\n        /// Construct with message, optional context and optional inner exception\n        /// </summary>\n        public OpenAiApiException(string message, Object context = null,  Exception innerException = null) : base(message, innerException)\n        {\n            Context = context;\n        }\n\n        /// <summary>\n        /// Prints an error to the unity console.\n        /// </summary>\n        public void LogAsError()\n        {\n            if(Context != null)\n            {\n                Debug.LogError($\"OpenAiApi Error: {Message}\", Context);\n            }\n            else\n            {\n                Debug.LogError($\"OpenAiApi Error: {Message}\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Base/OpenAiApiException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c74f739190347234db19aef3105a5375\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Base.meta",
    "content": "fileFormatVersion: 2\nguid: b2c6be357cb1e6142bb16905d61aabf4\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EChatModelNames/EChatModelName.cs",
    "content": "﻿using System;\n\nnamespace OpenAi.Api\n{\n    public static class UTEChatModelName\n    {\n        public static string GetModelName(EEngineName name)\n        {\n            switch (name)\n            {\n                case EEngineName.gpt_35_turbo:\n                    return UTModelNames.gpt_35_turbo;\n                case EEngineName.BETA_gpt_4:\n                    return UTModelNames.BETA_gpt_4;\n                case EEngineName.BETA_gpt_4_32k:\n                    return UTModelNames.BETA_gpt_4_32k;\n            }\n\n            throw new ArgumentException($\"Invalid enum value provided when getting chat model name. Value provided: {name}\");\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EChatModelNames/EChatModelName.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1357fb1fce4191e42827032bccc96935\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EChatModelNames.meta",
    "content": "fileFormatVersion: 2\nguid: d630afaa3786c95469a23e3dd97b1749\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EngineNames/EEngineName.cs",
    "content": "﻿using System;\n\nnamespace OpenAi.Api\n{\n    public enum EEngineName\n    {\n        // GPT-3\n        ada,\n        babbage,\n        curie,\n        davinci,\n        text_ada_001,\n        text_babbage_001,\n        text_curie_001,\n        // GPT 3-5\n        gpt_35_turbo,\n        text_davinci_003,\n        text_davinci_002,\n        code_davinci_002,\n        // GPT-4 in beta\n        BETA_gpt_4,\n        BETA_gpt_4_32k,\n    }\n\n    public static class UTEEngineName\n    {\n        public static string GetEngineName(EEngineName name)\n        {\n            switch (name)\n            {\n                case EEngineName.ada:\n                    return UTModelNames.ada;\n                case EEngineName.babbage:\n                    return UTModelNames.babbage;\n                case EEngineName.curie:\n                    return UTModelNames.curie;\n                case EEngineName.davinci:\n                    return UTModelNames.davinci;\n                case EEngineName.text_ada_001:\n                    return UTModelNames.text_ada_001;\n                case EEngineName.text_babbage_001:\n                    return UTModelNames.text_babbage_001;\n                case EEngineName.text_curie_001:\n                    return UTModelNames.text_curie_001;\n                case EEngineName.gpt_35_turbo:\n                    return UTModelNames.gpt_35_turbo;\n                case EEngineName.text_davinci_003:\n                    return UTModelNames.text_davinci_003;\n                case EEngineName.text_davinci_002:\n                    return UTModelNames.text_davinci_002;\n                case EEngineName.code_davinci_002:\n                    return UTModelNames.code_davinci_002;\n                case EEngineName.BETA_gpt_4:\n                    return UTModelNames.BETA_gpt_4;\n                case EEngineName.BETA_gpt_4_32k:\n                    return UTModelNames.BETA_gpt_4_32k;\n            }\n\n            throw new ArgumentException($\"Invalid enum value provided when getting model name. Value provided: {name}\");\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EngineNames/EEngineName.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a7f86371651b34640b3b6fc8c743ecb0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EngineNames/UTEngineNames.cs",
    "content": "﻿namespace OpenAi.Api\n{\n    public static class UTModelNames\n    {\n        // GPT-3\n        public const string ada = \"ada\";\n        public const string babbage = \"babbage\";\n        public const string curie = \"curie\";\n        public const string davinci = \"davinci\";\n        public const string text_ada_001 = \"text-ada-001\";\n        public const string text_babbage_001= \"text-babbage-001\";\n        public const string text_curie_001= \"text-curie-001\";\n\n        // GPT 3-5\n        public const string gpt_35_turbo = \"gpt-3.5-turbo\";\n        public const string text_davinci_003 = \"text-davinci-003\";\n        public const string text_davinci_002= \"text-davinci-002\";\n        public const string code_davinci_002 = \"code-davinci-002\";\n\n        // GPT-4 in beta\n        public const string BETA_gpt_4 = \"gpt-4\";\n        public const string BETA_gpt_4_32k = \"gpt-4-32k\";\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EngineNames/UTEngineNames.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 355de6e305023a9448d2b35ac39294a9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/EngineNames.meta",
    "content": "fileFormatVersion: 2\nguid: a9ce3ed80c6c87f439a23eafeb0342b7\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/StringOrArray.cs",
    "content": "﻿using OpenAi.Json;\n\nusing System.Collections.Generic;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Can be interpreted as a string (if only 1 string added) or an array, if multiple strings added. This is to facilitate arguments in the OpenAi.Api\n    /// </summary>\n    public class StringOrArray\n    {\n        private List<string> _elements;\n\n        /// <summary>\n        /// Create a string or array using input strings. If 0 strings are provided, Resolve() = null. If\n        /// 1 string is provided, Resolve() = a string, if 2+ strings are provided, Resolve() = string[]\n        /// </summary>\n        /// <param name=\"strings\"></param>\n        public StringOrArray(params string[] strings)\n        {\n            if (strings != null)\n            {\n                //Nullifies the empty strings in the array\n                for (var i = 0; i < strings.Length; i++)\n                {\n                    strings[i] = string.IsNullOrEmpty(strings[i]) ? null : strings[i];\n                }\n                _elements = new List<string>(strings);\n            }\n        }\n\n\n        /// <summary>\n        /// Resolves the StringOrArray to the appropriate type\n        /// </summary>\n        /// <returns></returns>\n        public object Resolve()\n        {\n            if (_elements == null || _elements.Count == 0) return null;\n            if (_elements.Count == 1) return _elements[0];\n            return _elements.ToArray();\n        }\n        \n        /// <summary>\n        /// Popualte based on json object\n        /// </summary>\n        public void FromJson(JsonObject json)\n        {\n            if(json.Type == EJsonType.List)\n            {\n                _elements = new List<string>();\n                foreach(JsonObject obj in json.NestedValues)\n                {\n                    _elements.Add(obj.StringValue);\n                }\n            } \n            else if(json.Type == EJsonType.Value)\n            {\n                _elements = new List<string>();\n                _elements.Add(json.StringValue);\n            }\n        }\n\n        /// <summary>\n        /// Implicitly make a StringOrArray from a string\n        /// </summary>\n        /// <param name=\"str\"></param>\n        public static implicit operator StringOrArray(string str)\n        {\n            if (string.IsNullOrEmpty(str)) return null;\n            return new StringOrArray(str);\n        }\n\n        /// <summary>\n        /// Implicitly make a StringOrArray from a string array\n        /// </summary>\n        /// <param name=\"str\"></param>\n        public static implicit operator StringOrArray(string[] strings)\n        {\n            if (strings == null) return null;\n            return new StringOrArray(strings);\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/StringOrArray.cs.meta",
    "content": "fileFormatVersion: 2\nguid: bbd00387caa7d8845a61bc6135e50e0a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/UnityWebRequestAsync/UnityWebRequestAwaiter.cs",
    "content": "// Taken from this gist https://gist.github.com/krzys-h/9062552e33dd7bd7fe4a6c12db109a1a\n\nusing System;\nusing System.Runtime.CompilerServices;\n\nusing UnityEngine;\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Api.V1\n{\n\t/// <summary>\n\t/// Allows the UnityWebRequest object to be awaited\n\t/// </summary>\n\tpublic class UnityWebRequestAwaiter : INotifyCompletion\n\t{\n\t\tprivate UnityWebRequestAsyncOperation asyncOp;\n\t\tprivate Action continuation;\n\n\t\tpublic UnityWebRequestAwaiter(UnityWebRequestAsyncOperation asyncOp)\n\t\t{\n\t\t\tthis.asyncOp = asyncOp;\n\t\t\tasyncOp.completed += OnRequestCompleted;\n\t\t}\n\n\t\tpublic bool IsCompleted { get { return asyncOp.isDone; } }\n\n\t\tpublic void GetResult() { }\n\n\t\tpublic void OnCompleted(Action continuation)\n\t\t{\n\t\t\tthis.continuation = continuation;\n\t\t}\n\n\t\tprivate void OnRequestCompleted(AsyncOperation obj)\n\t\t{\n\t\t\tcontinuation();\n\t\t}\n\t}\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/UnityWebRequestAsync/UnityWebRequestAwaiter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 80b39eca5abef8f428da95abb7e26b0b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/UnityWebRequestAsync/UnityWebRequestExtensions.cs",
    "content": "// Taken from this gist https://gist.github.com/krzys-h/9062552e33dd7bd7fe4a6c12db109a1a\n\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Api.V1\n{\n\t/// <summary>\n\t/// Provides a get waiter extension to Unity web requests to allow it to be awaited\n\t/// </summary>\n\tpublic static class ExtensionMethods\n\t{\n\t\tpublic static UnityWebRequestAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)\n\t\t{\n\t\t\treturn new UnityWebRequestAwaiter(asyncOp);\n\t\t}\n\t}\n}"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/UnityWebRequestAsync/UnityWebRequestExtensions.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ae29d89f8e5725341b1013077dec7a43\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility/UnityWebRequestAsync.meta",
    "content": "fileFormatVersion: 2\nguid: 290d20dbfb3926844b03ed47ed3145b6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/Utility.meta",
    "content": "fileFormatVersion: 2\nguid: afac1627f3594e144b74d8d81b1a0060\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/ChatResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n\n    /// <summary>\n    /// Resource providing base chat functionality. <see href=\"https://platform.openai.com/docs/api-reference/chat\"/>\n    /// </summary>\n    public class ChatResourceV1 : AApiResource<OpenAiApiV1>\n    {\n        /// <inheritdoc/>\n        public override string Endpoint => \"/chat\";\n\n        /// <summary>\n        /// Construct with parent\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public ChatResourceV1(OpenAiApiV1 parent) : base(parent) { Completions = new ChatCompletionsResourceV1(this); }\n\n        /// <summary>\n        /// Completions resource. <see href=\"https://platform.openai.com/docs/api-reference/chat/create\"/>\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public ChatCompletionsResourceV1 Completions { get; private set; }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/ChatResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4341471d81112ce45a0cff5db6755675\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/Completions/ChatCompletionRequestV1.cs",
    "content": "﻿using OpenAi.Json;\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Object used when requesting a chat completion. <see href=\"https://platform.openai.com/docs/api-reference/chat/create\"/>\n    /// </summary>\n    public class ChatCompletionRequestV1 : AModelV1\n    {\n        /// <summary>\n        /// The OpenAI model to use\n        /// </summary>\n        public string model;\n\n        /// <summary>\n        /// Messages to send\n        /// </summary>\n        public List<MessageV1> messages = new List<MessageV1>();\n\n        /// <summary>\n        /// What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.\n        /// </summary>\n        public float? temperature;\n\n        /// <summary>\n        /// An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.\n        /// </summary>\n        public float? top_p;\n\n        /// <summary>\n        /// How many completions to generate for each prompt. Note: Because this parameter generates many completions, it can quickly consume your token quota.Use carefully and ensure that you have reasonable settings for max_tokens and stop.\n        /// </summary>\n        public int? n;\n\n        /// <summary>\n        /// Whether to stream back partial progress. If set, tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a data: [DONE] message. <see href=\"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\"/>\n        /// </summary>\n        public bool? stream;\n\n        /// <summary>\n        /// Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.\n        /// </summary>\n        public StringOrArray stop;\n\n        /// <summary>\n        /// The maximum number of tokens to generate. Requests can use up to 2048 tokens shared between prompt and completion. (One token is roughly 4 characters for normal English text)\n        /// </summary>\n        public int? max_tokens;\n\n        /// <summary>\n        /// Number between 0 and 1 that penalizes new tokens based on whether they appear in the text so far. Increases the model's likelihood to talk about new topics. <see href=\"https://beta.openai.com/docs/api-reference/parameter-details\"/>\n        /// </summary>\n        public float? presence_penalty;\n\n        /// <summary>\n        /// Number between 0 and 1 that penalizes new tokens based on their existing frequency in the text so far. Decreases the model's likelihood to repeat the same line verbatim. <see href=\"https://beta.openai.com/docs/api-reference/parameter-details\"/>\n        /// </summary>\n        public float? frequency_penalty;\n\n        /// <summary>\n        /// Modify the likelihood of specified tokens appearing in the completion. Accepts a json object that maps tokens(specified by their token ID in the GPT tokenizer) to an associated bias value from -100 to 100. You can use this tokenizer tool (which works for both GPT-2 and GPT-3) to convert text to token IDs. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. As an example, you can pass <c>{\"50256\": -100}</c> to prevent the <|endoftext|> token from being generated.\n        /// </summary>\n        public Dictionary<string, int> logit_bias;\n\n        /// <summary>\n        /// Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.\n        /// </summary>\n        public string user;\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject json)\n        {\n            if (json.Type != EJsonType.Object) throw new OpenAiApiException(\"Deserialization failed, provided json is not an object\");\n\n            foreach (JsonObject obj in json.NestedValues)\n            {\n                switch (obj.Name)\n                {\n                    case nameof(model):\n                        model = obj.StringValue;\n                        break;\n                    case nameof(messages):\n                        foreach (JsonObject child in obj.NestedValues)\n                        {\n                            MessageV1 message = new MessageV1();\n                            message.FromJson(child);\n                            messages.Add(message);\n                        }\n                        break;\n                    case nameof(temperature):\n                        temperature = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(top_p):\n                        top_p = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(n):\n                        n = int.Parse(obj.StringValue);\n                        break;\n                    case nameof(stream):\n                        stream = bool.Parse(obj.StringValue);\n                        break;\n                    case nameof(stop):\n                        stop = new StringOrArray();\n                        stop.FromJson(obj);\n                        break;\n                    case nameof(max_tokens):\n                        max_tokens = int.Parse(obj.StringValue);\n                        break;\n                    case nameof(presence_penalty):\n                        presence_penalty = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(frequency_penalty):\n                        frequency_penalty = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(logit_bias):\n                        logit_bias = new Dictionary<string, int>();\n                        foreach (JsonObject child in obj.NestedValues)\n                        {\n                            logit_bias.Add(child.Name, int.Parse(child.StringValue));\n                        }\n                        break;\n                    case nameof(user):\n                        user = obj.StringValue;\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(model), model);\n            jb.AddArray<MessageV1>(nameof(messages), messages.ToArray());\n            jb.Add(nameof(temperature), temperature);\n            jb.Add(nameof(top_p), top_p);\n            jb.Add(nameof(n), n);\n            jb.Add(nameof(stream), stream);\n            jb.Add(nameof(stop), stop);\n            jb.Add(nameof(max_tokens), max_tokens);\n            jb.Add(nameof(presence_penalty), presence_penalty);\n            jb.Add(nameof(frequency_penalty), frequency_penalty);\n            jb.Add(nameof(logit_bias), logit_bias);\n            jb.Add(nameof(user), user);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/Completions/ChatCompletionRequestV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 92b8c1ff381c5c844b69877fec55c613\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/Completions/ChatCompletionsResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n\n    /// <summary>\n    /// Resource providing chat completions functionality. Text generation is the core function of the API. You give the API a prompt, and it generates a completion. The way you program the API to do a task is by simply describing the task in plain english or providing a few written examples. This simple approach works for a wide range of use cases, including summarization, translation, grammar correction, question answering, chatbots, composing emails, and much more (see the prompt library for inspiration). <see href=\"https://beta.openai.com/docs/examples\"/>\n    /// </summary>\n    public class ChatCompletionsResourceV1 : AApiResource<ChatResourceV1>\n    {\n        /// <inheritdoc/>\n        public override string Endpoint => \"/completions\";\n\n        /// <summary>\n        /// Construct with parent\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public ChatCompletionsResourceV1(ChatResourceV1 parent) : base(parent) { }\n\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>false</c>. To stream, use <see cref=\"CreateCompletionAsync_EventStream(CompletionRequestV1, Action{ApiResult{CompletionV1}}, Action{int, CompletionV1}, Action)\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public async Task<ApiResult<ChatCompletionV1>> CreateChatCompletionAsync(ChatCompletionRequestV1 request)\n        {\n            return await PostAsync<ChatCompletionRequestV1, ChatCompletionV1>(request);\n        }\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>false</c>. To stream, use <see cref=\"CreateCompletionCoroutine_EventStream(MonoBehaviour, CompletionRequestV1, Action{ApiResult{CompletionV1}}, Action{int, CompletionV1}, Action)\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public Coroutine CreateChatCompletionCoroutine(MonoBehaviour mono, ChatCompletionRequestV1 request, Action<ApiResult<ChatCompletionV1>> onResult)\n        {\n            return PostCoroutine(mono, request, onResult);\n        }\n\n        #region Streaming\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>true</c>. To stream, use <see cref=\"CreateCompletionAsync(CompletionRequestV1)\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"ChatCompletionResult.Choices\"/> property for the completions.</returns>\n        public async Task CreateChatCompletionAsync_EventStream(ChatCompletionRequestV1 request, Action<ApiResult<ChatCompletionV1>> onRequestStatus, Action<int, ChatCompletionV1> onPartialResult, Action onCompletion = null)\n        {\n            request.stream = true;\n            await PostAsync_EventStream(request, onRequestStatus, onPartialResult, onCompletion);\n        }\n\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>true</c>. To stream, use <see cref=\"CreateCompletionCoroutine(MonoBehaviour, CompletionRequestV1, Action{ApiResult{CompletionV1}})\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public Coroutine CreateChatCompletionCoroutine_EventStream(MonoBehaviour mono, ChatCompletionRequestV1 request, Action<ApiResult<ChatCompletionV1>> onRequestStatus, Action<int, ChatCompletionV1> onPartialResult, Action onCompletion = null)\n        {\n            request.stream = true;\n            return PostCoroutine_EventStream(mono, request, onRequestStatus, onPartialResult, onCompletion);\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/Completions/ChatCompletionsResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: bdb1362d65b74a043a3cea97ee915da7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat/Completions.meta",
    "content": "fileFormatVersion: 2\nguid: d65146491b5b90342a2f90ee79c5186b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Chat.meta",
    "content": "fileFormatVersion: 2\nguid: 29e74741b9ee81547a568f5cedb5367c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/Completions/CompletionRequestV1.cs",
    "content": "﻿using OpenAi.Json;\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Object used when requesting a completion. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>\n    /// </summary>\n    public class CompletionRequestV1 : AModelV1\n    {\n        /// <summary>\n        /// The prompt(s) to generate completions for, encoded as a string, a list of strings, or a list of token lists. Note that<|endoftext|> is the document separator that the model sees during training, so if a prompt is not specified the model will generate as if from the beginning of a new document.\n        /// </summary>\n        public StringOrArray prompt;\n\n        /// <summary>\n        /// The maximum number of tokens to generate. Requests can use up to 2048 tokens shared between prompt and completion. (One token is roughly 4 characters for normal English text)\n        /// </summary>\n        public int? max_tokens;\n\n        /// <summary>\n        /// What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.\n        /// </summary>\n        public float? temperature;\n\n        /// <summary>\n        /// An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.\n        /// </summary>\n        public float? top_p;\n\n        /// <summary>\n        /// How many completions to generate for each prompt. Note: Because this parameter generates many completions, it can quickly consume your token quota.Use carefully and ensure that you have reasonable settings for max_tokens and stop.\n        /// </summary>\n        public int? n;\n\n        /// <summary>\n        /// Whether to stream back partial progress. If set, tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a data: [DONE] message. <see href=\"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\"/>\n        /// </summary>\n        public bool? stream;\n\n        /// <summary>\n        /// Include the log probabilities on the logprobs most likely tokens, as well the chosen tokens. For example, if logprobs is 10, the API will return a list of the 10 most likely tokens. the API will always return the logprob of the sampled token, so there may be up to logprobs+1 elements in the response.\n        /// </summary>\n        public int? logprobs;\n\n        /// <summary>\n        /// Echo back the prompt in addition to the completion\n        /// </summary>\n        public bool? echo;\n\n        /// <summary>\n        /// Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.\n        /// </summary>\n        public StringOrArray stop;\n\n        /// <summary>\n        /// Number between 0 and 1 that penalizes new tokens based on whether they appear in the text so far. Increases the model's likelihood to talk about new topics. <see href=\"https://beta.openai.com/docs/api-reference/parameter-details\"/>\n        /// </summary>\n        public float? presence_penalty;\n\n        /// <summary>\n        /// Number between 0 and 1 that penalizes new tokens based on their existing frequency in the text so far. Decreases the model's likelihood to repeat the same line verbatim. <see href=\"https://beta.openai.com/docs/api-reference/parameter-details\"/>\n        /// </summary>\n        public float? frequency_penalty;\n\n        /// <summary>\n        /// Generates best_of completions server-side and returns the \"best\" (the one with the lowest log probability per token). Results cannot be streamed. When used with n, best_of controls the number of candidate completions and n specifies how many to return – best_of must be greater than n. Note: Because this parameter generates many completions, it can quickly consume your token quota.Use carefully and enure that you have reasonable settings for max_tokens and stop.\n        /// </summary>\n        public int? best_of;\n\n        /// <summary>\n        /// Modify the likelihood of specified tokens appearing in the completion. Accepts a json object that maps tokens(specified by their token ID in the GPT tokenizer) to an associated bias value from -100 to 100. You can use this tokenizer tool (which works for both GPT-2 and GPT-3) to convert text to token IDs. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. As an example, you can pass <c>{\"50256\": -100}</c> to prevent the <|endoftext|> token from being generated.\n        /// </summary>\n        public Dictionary<string, int> logit_bias;\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject json)\n        {\n            if (json.Type != EJsonType.Object) throw new OpenAiApiException(\"Deserialization failed, provided json is not an object\");\n\n            foreach(JsonObject obj in json.NestedValues)\n            {\n                switch (obj.Name) \n                {\n                    case nameof(prompt):\n                        prompt = new StringOrArray();\n                        prompt.FromJson(obj);\n                        break;\n                    case nameof(max_tokens):\n                        max_tokens = int.Parse(obj.StringValue);\n                        break;\n                    case nameof(temperature):\n                        temperature = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(top_p):\n                        top_p = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(n):\n                        n = int.Parse(obj.StringValue);\n                        break;\n                    case nameof(stream):\n                        stream = bool.Parse(obj.StringValue);\n                        break;\n                    case nameof(logprobs):\n                        logprobs = int.Parse(obj.StringValue);\n                        break;\n                    case nameof(echo):\n                        echo = bool.Parse(obj.StringValue);\n                        break;\n                    case nameof(stop):\n                        stop = new StringOrArray();\n                        stop.FromJson(obj);\n                        break;\n                    case nameof(presence_penalty):\n                        presence_penalty = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(frequency_penalty):\n                        frequency_penalty = float.Parse(obj.StringValue);\n                        break;\n                    case nameof(best_of):\n                        best_of = int.Parse(obj.StringValue);\n                        break;\n                    case nameof(logit_bias):\n                        logit_bias = new Dictionary<string, int>();\n\n                        foreach(JsonObject child in obj.NestedValues)\n                        {\n                            logit_bias.Add(child.Name, int.Parse(child.StringValue));\n                        }\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(prompt), prompt);\n            jb.Add(nameof(max_tokens), max_tokens);\n            jb.Add(nameof(temperature), temperature);\n            jb.Add(nameof(top_p), top_p);\n            jb.Add(nameof(n), n);\n            jb.Add(nameof(stream), stream);\n            jb.Add(nameof(logprobs), logprobs);\n            jb.Add(nameof(echo), echo);\n            jb.Add(nameof(stop), stop);\n            jb.Add(nameof(presence_penalty), presence_penalty);\n            jb.Add(nameof(frequency_penalty), frequency_penalty);\n            jb.Add(nameof(best_of), best_of);\n            jb.Add(nameof(logit_bias), logit_bias);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/Completions/CompletionRequestV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d67961fac1123804cbd0b551d5b54bc3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/Completions/CompletionsResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n\n    /// <summary>\n    /// Resource providing completions functionality. Text generation is the core function of the API. You give the API a prompt, and it generates a completion. The way you program the API to do a task is by simply describing the task in plain english or providing a few written examples. This simple approach works for a wide range of use cases, including summarization, translation, grammar correction, question answering, chatbots, composing emails, and much more (see the prompt library for inspiration). <see href=\"https://beta.openai.com/docs/examples\"/>\n    /// </summary>\n    public class CompletionsResourceV1 : AApiResource<EngineResourceV1>\n    {\n        /// <inheritdoc/>\n        public override string Endpoint => \"/completions\";\n\n        /// <summary>\n        /// Construct with parent\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public CompletionsResourceV1(EngineResourceV1 parent) : base(parent) { }\n\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>false</c>. To stream, use <see cref=\"CreateCompletionAsync_EventStream(CompletionRequestV1, Action{ApiResult{CompletionV1}}, Action{int, CompletionV1}, Action)\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public async Task<ApiResult<CompletionV1>> CreateCompletionAsync(CompletionRequestV1 request)\n        {\n            request.stream = false;\n            return await PostAsync<CompletionRequestV1, CompletionV1>(request);\n        }\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>false</c>. To stream, use <see cref=\"CreateCompletionCoroutine_EventStream(MonoBehaviour, CompletionRequestV1, Action{ApiResult{CompletionV1}}, Action{int, CompletionV1}, Action)\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public Coroutine CreateCompletionCoroutine(MonoBehaviour mono, CompletionRequestV1 request, Action<ApiResult<CompletionV1>> onResult)\n        {\n            request.stream = false;\n            return PostCoroutine(mono, request, onResult);\n        }\n\n        #region Streaming\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>true</c>. To stream, use <see cref=\"CreateCompletionAsync(CompletionRequestV1)\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public async Task CreateCompletionAsync_EventStream(CompletionRequestV1 request, Action<ApiResult<CompletionV1>> onRequestStatus, Action<int, CompletionV1> onPartialResult, Action onCompletion = null)\n        {\n            request.stream = true;\n            await PostAsync_EventStream(request, onRequestStatus, onPartialResult, onCompletion);\n        }\n\n        /// <summary>\n        /// This is the main endpoint of the API. Returns the predicted completion for the given prompt, and can also return the probabilities of alternative tokens at each position if requested. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/>. Ignores with <c>request.stream</c> parameter and automatically set to <c>true</c>. To stream, use <see cref=\"CreateCompletionCoroutine(MonoBehaviour, CompletionRequestV1, Action{ApiResult{CompletionV1}})\"/> instead\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns>Asynchronously returns the completion result.  Look in its <see cref=\"CompletionResult.Choices\"/> property for the completions.</returns>\n        public Coroutine CreateCompletionCoroutine_EventStream(MonoBehaviour mono, CompletionRequestV1 request, Action<ApiResult<CompletionV1>> onRequestStatus, Action<int, CompletionV1> onPartialResult, Action onCompletion = null)\n        {\n            request.stream = true;\n            return PostCoroutine_EventStream(mono, request, onRequestStatus, onPartialResult, onCompletion);\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/Completions/CompletionsResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 930378a6629aa0d49beee3f8872ecd17\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/Completions.meta",
    "content": "fileFormatVersion: 2\nguid: 9c530e33d81a2a44e992bdb1e6e1e42b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/EngineResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Resource related to a specific engine. <see href=\"https://beta.openai.com/docs/api-reference/retrieve-engine\"/>\n    /// </summary>\n    public class EngineResourceV1 : AApiResource<EnginesResourceV1>\n    {\n        private string _endpoint;\n\n        /// <inheritdoc />\n        public override string Endpoint => _endpoint;\n\n        /// <summary>\n        /// Completions resource. <see href=\"https://beta.openai.com/docs/api-reference/create-completion\"/> and onwards.\n        /// </summary>\n        public CompletionsResourceV1 Completions { get; private set; }\n\n        /// <summary>\n        /// Construct an engine resource with parent and engineId\n        /// </summary>\n        /// <param name=\"engineId\">The ID of the engine to use for this request</param>\n        public EngineResourceV1(EnginesResourceV1 parent, string engineId) : base(parent)\n        {\n            _endpoint = $\"/{engineId}\";\n            Completions = new CompletionsResourceV1(this);\n        }\n\n        /// <summary>\n        /// Retrieves an engine instance, providing basic information about the engine such as the owner and availability. <see href=\"https://beta.openai.com/docs/api-reference/retrieve-engine\"/>\n        /// </summary>\n        public async Task<ApiResult<EngineV1>> RetrieveEngineAsync() => await GetAsync<EngineV1>();\n\n        /// <summary>\n        /// Retrieves an engine instance, providing basic information about the engine such as the owner and availability. <see href=\"https://beta.openai.com/docs/api-reference/retrieve-engine\"/>\n        /// </summary>\n        public Coroutine RetrieveEngineCoroutine(MonoBehaviour mono, Action<ApiResult<EngineV1>> onResult) => GetCoroutine(mono, onResult);\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine/EngineResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: baeec16b75e2c6044b08752a3b420e84\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/Engine.meta",
    "content": "fileFormatVersion: 2\nguid: a73c5a0a80b8c364ebb4a11a5114bab9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/EnginesResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Provides functions to get infomation about available engines\n    /// </summary>\n    public class EnginesResourceV1 : AApiResource<OpenAiApiV1>\n    {\n        /// <inheritdoc />\n        public override string Endpoint => \"/engines\";\n\n        /// <summary>\n        /// Construct Engines resource with parent\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public EnginesResourceV1(OpenAiApiV1 parent) : base(parent) { }\n\n        /// <summary>\n        /// Construct an engine resource using an engine id. The engine id must be a valid engine.\n        /// <see href=\"https://beta.openai.com/docs/api-reference/retrieve-engine\"/>\n        /// </summary>\n        /// <param name=\"engineId\">The ID of the engine to use for this request</param>\n        public EngineResourceV1 Engine(string engineId) => new EngineResourceV1(this, engineId);\n\n        /// <summary>\n        /// Lists the currently available engines, and provides basic information about each one such as the owner and availability. <see href=\"https://beta.openai.com/docs/api-reference/list-engines\"/>\n        /// </summary>\n        public async Task<ApiResult<EnginesListV1>> ListEnginesAsync() => await GetAsync<EnginesListV1>();\n\n        /// <summary>\n        /// Lists the currently available engines, and provides basic information about each one such as the owner and availability. <see href=\"https://beta.openai.com/docs/api-reference/list-engines\"/>\n        /// </summary>\n        public Coroutine ListEnginesCoroutine(MonoBehaviour mono, Action<ApiResult<EnginesListV1>> onResult) => GetCoroutine(mono, onResult);\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines/EnginesResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9d81cffee98ada249b5ebca9d97eaba7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Engines.meta",
    "content": "fileFormatVersion: 2\nguid: bb4ca3b2a411cd3408d4bb4db3f9c235\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Files/File/FileResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Resource related to a specific engine. <see href=\"https://beta.openai.com/docs/api-reference/retrieve-engine\"/>\n    /// </summary>\n    public class FileResourceV1 : AApiResource<FilesResourceV1>\n    {\n        private string _endpoint;\n\n        /// <inheritdoc />\n        public override string Endpoint => _endpoint;\n\n        /// <summary>\n        /// Construct an engine resource with parent and engineId\n        /// </summary>\n        /// <param name=\"fileId\">The ID of the engine to use for this request</param>\n        public FileResourceV1(FilesResourceV1 parent, string fileId) : base(parent)\n        {\n            _endpoint = $\"/{fileId}\";\n        }\n\n        /// <summary>\n        /// Retrieve a file from the OpenAi Api backend <see href=\"https://beta.openai.com/docs/api-reference/files/retrieve\"/>\n        /// </summary>\n        public async Task<ApiResult<FileV1>> RetrieveEngineAsync() => await GetAsync<FileV1>();\n\n        /// <summary>\n        /// Retrieve a file from the OpenAi Api backend <see href=\"https://beta.openai.com/docs/api-reference/files/retrieve\"/>\n        /// </summary>\n        public Coroutine RetrieveEngineCoroutine(MonoBehaviour mono, Action<ApiResult<FileV1>> onResult) => GetCoroutine(mono, onResult);\n\n        /// <summary>\n        /// Delete a file from the OpenAi Api backend <see href=\"https://beta.openai.com/docs/api-reference/files/delete\"/>\n        /// </summary>\n        public async Task<ApiResult> DeleteFileAsync() => await DeleteAsync();\n\n        /// <summary>\n        /// Delete a file from the OpenAi Api backend <see href=\"https://beta.openai.com/docs/api-reference/files/delete\"/>\n        /// </summary>\n        public Coroutine DeleteFileCoroutine(MonoBehaviour mono, Action<ApiResult<FileV1>> onResult) => GetCoroutine(mono, onResult);\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Files/File/FileResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5461aae83fd7f5b43b65528149966f6e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Files/File.meta",
    "content": "fileFormatVersion: 2\nguid: 51906efa7ecd41c4ca8c4469cc98964b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Files/FilesResourceV1.cs",
    "content": "using System;\nusing System.Threading.Tasks;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Provides functions to list and upload files\n    /// </summary>\n    public class FilesResourceV1 : AApiResource<OpenAiApiV1>\n    {\n        /// <inheritdoc />\n        public override string Endpoint => \"/files\";\n\n        /// <summary>\n        /// Construct Files resource for listing and manging files\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public FilesResourceV1(OpenAiApiV1 parent) : base(parent) { }\n\n        /// <summary>\n        /// Construct an engine resource using an engine id. The engine id must be a valid engine.\n        /// <see href=\"https://beta.openai.com/docs/api-reference/retrieve-engine\"/>\n        /// </summary>\n        /// <param name=\"engineId\">The ID of the engine to use for this request</param>\n        //public FilesResourceV1 Engine(string engineId) => new FilesResourceV1(this, );\n\n        /// <summary>\n        /// Lists the currently available files <see href=\"https://beta.openai.com/docs/api-reference/files/list\"/>\n        /// </summary>\n        public async Task<ApiResult<FilesListV1>> ListFilesAsync() => await GetAsync<FilesListV1>();\n\n        /// <summary>\n        /// Lists the currently available files <see href=\"https://beta.openai.com/docs/api-reference/files/list\"/>\n        /// </summary>\n        public Coroutine ListFilesCoroutine(MonoBehaviour mono, Action<ApiResult<FilesListV1>> onResult) => GetCoroutine(mono, onResult);\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Files/FilesResourceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 26addc9b68de71c449ae34c6cdb88510\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api/Files.meta",
    "content": "fileFormatVersion: 2\nguid: a6977f671f4c9ed44b1354cb9dcac515\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Api.meta",
    "content": "fileFormatVersion: 2\nguid: a74574a8cf46ac747ad2a2dd7da64702\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/AnswerV1.cs",
    "content": "using OpenAi.Json;\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    public class AnswerV1 : AModelV1\n    {\n        public string[] answers;\n        public string completion;\n        public string model;\n        public string obj;\n        public string search_model;\n        public SelectedDocumentV1[] selected_documents;\n\n        public override void FromJson(JsonObject json)\n        {\n            foreach (JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(answers):\n                        answers = jo.AsStringArray();\n                        break;\n                    case nameof(completion):\n                        completion = jo.StringValue;\n                        break;\n                    case nameof(model):\n                        model = jo.StringValue;\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case nameof(search_model):\n                        search_model = jo.StringValue;\n                        break;\n                    case nameof(selected_documents):\n                        selected_documents = ArrayFromJson<SelectedDocumentV1>(jo);\n                        break;\n\n                }\n            }\n        }\n\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.AddArray(nameof(answers), answers);\n            jb.Add(nameof(completion), completion);\n            jb.Add(nameof(model), model);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(search_model), search_model);\n            jb.AddArray(nameof(selected_documents), selected_documents);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/AnswerV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: eb5c442bf526a7346b706c3e1214445d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ChatChoiceV1.cs",
    "content": "using OpenAi.Json;\r\n\r\nusing System;\r\nusing UnityEngine;\r\n\r\nnamespace OpenAi.Api.V1\r\n{\r\n    /// <summary>\r\n    /// A single choice returned by the OpenAi Api chat completion endpoint\r\n    /// </summary>\r\n    public class ChatChoiceV1 : AModelV1\r\n    {\r\n        /// <summary>\r\n        /// The returned message\r\n        /// </summary>\r\n        public MessageV1 message;\r\n\r\n        /// <summary>\r\n        /// A portion of the returned message\r\n        /// </summary>\r\n        public DeltaV1 delta;\r\n\r\n        /// <summary>\r\n        /// the index of the choice\r\n        /// </summary>\r\n        public int index;\r\n\r\n        /// <summary>\r\n        /// The reason the engine ended the completion\r\n        /// </summary>\r\n        public string finish_reason;\r\n\r\n        /// <inheritdoc />\r\n        public override string ToJson()\r\n        {\r\n            JsonBuilder jb = new JsonBuilder();\r\n\r\n            jb.StartObject();\r\n            if (message != null) \r\n                jb.Add(nameof(message), message.ToJson());\r\n            else if (delta != null) \r\n                jb.Add(nameof(delta), delta.ToJson());\r\n            jb.Add(nameof(index), index);\r\n            jb.Add(nameof(finish_reason), finish_reason);\r\n            jb.EndObject();\r\n\r\n            return jb.ToString();\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public override void FromJson(JsonObject jsonObj)\r\n        {\r\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\r\n\r\n            foreach (JsonObject jo in jsonObj.NestedValues)\r\n            {\r\n                switch (jo.Name)\r\n                {\r\n                    case nameof(message):\r\n                        message = new MessageV1();\r\n                        message.FromJson(jo);\r\n                        break;\r\n                    case nameof(delta):\r\n                        delta = new DeltaV1();\r\n                        delta.FromJson(jo);\r\n                        break;\r\n                    case nameof(index):\r\n                        index = int.Parse(jo.StringValue);\r\n                        break;\r\n                    case nameof(finish_reason):\r\n                        finish_reason = jo.StringValue;\r\n                        break;\r\n                    default:\r\n                        Debug.LogWarning(\"ChatChoiceV1: missing field \" + jo.Name);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ChatChoiceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1dd6e46a4a834ac479389881228aac81\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ChatCompletionV1.cs",
    "content": "﻿using OpenAi.Json;\n\nusing System;\nusing System.Text;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// The response to chat completion request\n    /// </summary>\n    public class ChatCompletionV1 : AModelV1\n    {\n        /// <summary>\n        /// the id of the competion\n        /// </summary>\n        public string id;\n\n        /// <summary>\n        /// The object type (text_completion)\n        /// </summary>\n        public string obj;\n\n        /// <summary>\n        /// The created time as Unix epoch\n        /// </summary>\n        public int created;\n\n        /// <summary>\n        /// The model used to create the completion\n        /// </summary>\n        public string model;\n\n        /// <summary>\n        /// The choices returned by the completion\n        /// </summary>\n        public ChatChoiceV1[] choices;\n\n        /// <summary>\n        /// Token usage stats\n        /// </summary>\n        public UsageV1 usage;\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(id), id);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(created), created);\n            jb.Add(nameof(model), model);\n            jb.AddArray(nameof(choices), choices);\n            jb.AddSimpleObject(nameof(usage), usage);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject jsonObj)\n        {\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\n\n            foreach(JsonObject jo in jsonObj.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(id):\n                        id = jo.StringValue;\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case nameof(created):\n                        created = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(model):\n                        model = jo.StringValue;\n                        break;\n                    case nameof(choices):\n                        ChatChoiceV1[] choiceArray = new ChatChoiceV1[jo.NestedValues.Count];\n                        for(int i = 0; i<choiceArray.Length; i++)\n                        {\n                            ChatChoiceV1 n = new ChatChoiceV1();\n                            n.FromJson(jo.NestedValues[i]);\n                            choiceArray[i] = n;\n                        }\n                        choices = choiceArray;\n                        break;\n                    case nameof(usage):\n                        usage = new UsageV1();\n                        usage.FromJson(jo);\n                        break;\n                    default:\n                        Debug.LogWarning(\"ChatCompletionV1: missing field \" + jo.Name);\n                        break;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ChatCompletionV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 96be4d321a1faa343aa7d8c849a2af3c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ChoiceV1.cs",
    "content": "using OpenAi.Json;\n\nusing System;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A single choice returned by the OpenAi Api completion endpoint\n    /// </summary>\n    public class ChoiceV1 : AModelV1\n    {\n        /// <summary>\n        /// The returned text\n        /// </summary>\n        public string text;\n\n        /// <summary>\n        /// the index of the choice\n        /// </summary>\n        public int index;\n\n        /// <summary>\n        /// The log probabilities\n        /// </summary>\n        public string logprobs;\n\n        /// <summary>\n        /// The reason the engine ended the completion\n        /// </summary>\n        public string finish_reason;\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(text), text);\n            jb.Add(nameof(index), index);\n            jb.Add(nameof(logprobs), logprobs);\n            jb.Add(nameof(finish_reason), finish_reason);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject jsonObj)\n        {\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\n\n            foreach (JsonObject jo in jsonObj.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(text):\n                        text = jo.StringValue;\n                        break;\n                    case nameof(index):\n                        index = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(logprobs):\n                        logprobs = jo.StringValue;\n                        break;\n                    case nameof(finish_reason):\n                        finish_reason = jo.StringValue;\n                        break;\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ChoiceV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 03e638cb303909c4abbf7db3625a542b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ClassificationV1.cs",
    "content": "using OpenAi.Json;\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    public class ClassificationV1 : AModelV1\n    {\n        /// <summary>\n        /// id of classification\n        /// </summary>\n        public string completion;\n\n        /// <summary>\n        /// label selected by classificaiton\n        /// </summary>\n        public string label;\n\n        /// <summary>\n        /// model used to perform classification\n        /// </summary>\n        public string model;\n\n        /// <summary>\n        /// The type of task performed by the completion, in this case classification\n        /// </summary>\n        public string obj;\n\n        /// <summary>\n        /// The search model applied to the classification. \n        /// </summary>\n        public string search_model;\n\n        /// <summary>\n        /// The examples provided to perform the completion with\n        /// </summary>\n        public SelectedExampleV1[] selected_examples;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach (JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(completion):\n                        completion = jo.StringValue;\n                        break;\n                    case nameof(label):\n                        label = jo.StringValue;\n                        break;\n                    case nameof(model):\n                        model = jo.StringValue;\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case nameof(search_model):\n                        search_model = jo.StringValue;\n                        break;\n                    case nameof(selected_examples):\n                        selected_examples = ArrayFromJson<SelectedExampleV1>(jo);\n                        break;\n\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(completion), completion);\n            jb.Add(nameof(label), label);\n            jb.Add(nameof(model), model);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(search_model), search_model);\n            jb.AddArray(nameof(selected_examples), selected_examples);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/ClassificationV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 502995a34cdbdce4491a77c0acaa9461\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/CompletionV1.cs",
    "content": "﻿using OpenAi.Json;\n\nusing System;\nusing System.Text;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// The response to completion request\n    /// </summary>\n    public class CompletionV1 : AModelV1\n    {\n        /// <summary>\n        /// the id of the competion\n        /// </summary>\n        public string id;\n\n        /// <summary>\n        /// The object type (text_completion)\n        /// </summary>\n        public string obj;\n\n        /// <summary>\n        /// The created time as Unix epoch\n        /// </summary>\n        public int created;\n\n        /// <summary>\n        /// The model used to create the completion\n        /// </summary>\n        public string model;\n\n        /// <summary>\n        /// The choices returned by the completion\n        /// </summary>\n        public ChoiceV1[] choices;\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(id), id);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(created), created);\n            jb.Add(nameof(model), model);\n            jb.AddArray(nameof(choices), choices);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject jsonObj)\n        {\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\n\n            foreach(JsonObject jo in jsonObj.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(id):\n                        id = jo.StringValue;\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case nameof(created):\n                        created = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(model):\n                        model = jo.StringValue;\n                        break;\n                    case nameof(choices):\n                        ChoiceV1[] choiceArray = new ChoiceV1[jo.NestedValues.Count];\n                        for(int i = 0; i<choiceArray.Length; i++)\n                        {\n                            ChoiceV1 n = new ChoiceV1();\n                            n.FromJson(jo.NestedValues[i]);\n                            choiceArray[i] = n;\n                        }\n                        choices = choiceArray;\n                        break;\n\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/CompletionV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ac9908e8d933399498c04f851ba139df\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/DeltaV1.cs",
    "content": "using OpenAi.Json;\r\n\r\nusing System;\r\nusing UnityEngine;\r\n\r\nnamespace OpenAi.Api.V1\r\n{\r\n    /// <summary>\r\n    /// A partial message returned from the OpenAi Api chat completion endpoint\r\n    /// </summary>\r\n    public class DeltaV1 : AModelV1\r\n    {\r\n        /// <summary>\r\n        /// the message object role\r\n        /// </summary>\r\n        public MessageV1.MessageRole? role;\r\n\r\n        /// <summary>\r\n        /// the content of the message\r\n        /// </summary>\r\n        public string content;\r\n\r\n        /// <inheritdoc />\r\n        public override string ToJson()\r\n        {\r\n            JsonBuilder jb = new JsonBuilder();\r\n\r\n            jb.StartObject();\r\n            if (role != null) jb.Add(nameof(role), role.ToString());\r\n            jb.Add(nameof(content), content);\r\n            jb.EndObject();\r\n\r\n            return jb.ToString();\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public override void FromJson(JsonObject jsonObj)\r\n        {\r\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\r\n\r\n            foreach (JsonObject jo in jsonObj.NestedValues)\r\n            {\r\n                switch (jo.Name)\r\n                {\r\n                    case nameof(role):\r\n                        role = (MessageV1.MessageRole?)Enum.Parse(typeof(MessageV1.MessageRole), jo.StringValue);\r\n                        break;\r\n                    case nameof(content):\r\n                        content = jo.StringValue;\r\n                        break;\r\n                    default:\r\n                        Debug.LogWarning(\"DeltaV1: missing field \" + jo.Name);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/DeltaV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8c653c686b46c594aa1cdf39c1342a4e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/EngineV1.cs",
    "content": "﻿using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Info about an engine. <see cref=\"https://beta.openai.com/docs/api-reference/list-engines\"/>\n    /// </summary>\n    public class EngineV1 : AModelV1\n    {\n        /// <summary>\n        /// Engine id\n        /// </summary>\n        public string id;\n\n        /// <summary>\n        /// object type (\"engine\")\n        /// </summary>\n        public string obj;\n\n        /// <summary>\n        /// Owner of the engine\n        /// </summary>\n        public string owner;\n\n        /// <summary>\n        /// Is the engine ready? Not clear what this means\n        /// </summary>\n        public bool? ready;\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject json)\n        {\n            foreach(JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case \"id\":\n                        id = jo.StringValue;\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case \"owner\":\n                        owner = jo.StringValue;\n                        break;\n                    case \"ready\":\n                        ready = bool.Parse(jo.StringValue);\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(id), id);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(owner), owner);\n            jb.Add(nameof(ready), ready);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/EngineV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e29977a3db79cb946aa620129154da46\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/EnginesListV1.cs",
    "content": "﻿using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A list of engines. <see cref=\"https://beta.openai.com/docs/api-reference/list-engines\"/>\n    /// </summary>\n    public class EnginesListV1 : AModelV1\n    {\n        /// <summary>\n        /// The list of engines\n        /// </summary>\n        public EngineV1[] data;\n\n        /// <summary>\n        /// The obj type (list)\n        /// </summary>\n        public string obj;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach (JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case \"data\":\n                        data = ArrayFromJson<EngineV1>(jo);\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.AddArray(nameof(data), data);\n            jb.Add(\"object\", obj);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/EnginesListV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 77f46c211a2e79f45aa478f113b8066c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/FileV1.cs",
    "content": "﻿using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Info about a file. <see cref=\"https://beta.openai.com/docs/api-reference/files/list\"/>\n    /// </summary>\n    public class FileV1 : AModelV1\n    {\n        /// <summary>\n        /// Engine id\n        /// </summary>\n        public string id;\n\n        /// <summary>\n        /// object type (\"engine\")\n        /// </summary>\n        public string obj;\n\n        /// <summary>\n        /// the byte size of the file\n        /// </summary>\n        public int? bytes;\n\n        /// <summary>\n        /// The unix epoch the file was created at\n        /// </summary>\n        public int? created_at;\n\n        /// <summary>\n        /// The name of the file\n        /// </summary>\n        public string filename;\n\n        /// <summary>\n        /// The use case the the file is ued for\n        /// </summary>\n        public string purpose;\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject json)\n        {\n            foreach(JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(id):\n                        id = jo.StringValue;\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case nameof(bytes):\n                        bytes = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(created_at):\n                        created_at = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(filename):\n                        filename = jo.StringValue;\n                        break;\n                    case nameof(purpose):\n                        purpose = jo.StringValue;\n                        break;\n\n                }\n            }\n        }\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(id), id);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(bytes), bytes);\n            jb.Add(nameof(created_at), created_at);\n            jb.Add(nameof(filename), filename);\n            jb.Add(nameof(purpose), purpose);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/FileV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ca8c4f867680cbf4c87ce8e9e34fb9e2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/FilesListV1.cs",
    "content": "﻿using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A list of files. <see cref=\"https://beta.openai.com/docs/api-reference/files/list\"/>\n    /// </summary>\n    public class FilesListV1 : AModelV1\n    {\n        /// <summary>\n        /// The list of engines\n        /// </summary>\n        public FileV1[] data;\n\n        /// <summary>\n        /// The obj type (list)\n        /// </summary>\n        public string obj;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach (JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case \"data\":\n                        data = ArrayFromJson<FileV1>(jo);\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.AddArray(nameof(data), data);\n            jb.Add(\"object\", obj);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/FilesListV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2853cf33389674b43892960fb673f210\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/LabeledExampleV1.cs",
    "content": "using OpenAi.Json;\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// <see cref=\"https://beta.openai.com/docs/api-reference/classifications/create#classifications/create-examples\"/>\n    /// </summary>\n    public class LabeledExampleV1 : AModelV1\n    {\n        /// <summary>\n        /// The example that you are performing a search on\n        /// </summary>\n        public string example;\n\n        /// <summary>\n        /// The label that is used when trying to classify a prompt against an example\n        /// </summary>\n        public string label;\n\n        public LabeledExampleV1(string example, string label)\n        {\n            this.example = example == null ? \"\" : example;\n            this.label = label == null ? \"\" : label;\n        }\n\n        public LabeledExampleV1() { }\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            if (json.NestedValues.Count != 2) \n                throw new OpenAiJsonException($\"Received badly formated LabeledExampleV1 array\");\n\n            example = json.NestedValues[0].StringValue;\n            label = json.NestedValues[1].StringValue;\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n            jb.AddArray(new string[] { example, label });\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/LabeledExampleV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 49d8145284aa67f4aac19f1dfac484de\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/MessageV1.cs",
    "content": "using OpenAi.Json;\r\n\r\nusing System;\r\nusing UnityEngine;\r\n\r\nnamespace OpenAi.Api.V1\r\n{\r\n    /// <summary>\r\n    /// A single message passed to the OpenAi Api chat completion endpoint\r\n    /// </summary>\r\n    [System.Serializable]\r\n    public class MessageV1 : AModelV1\r\n    {\r\n        public enum MessageRole { system, user, assistant };\r\n\r\n        /// <summary>\r\n        /// the message object role\r\n        /// </summary>\r\n        public MessageRole role;\r\n\r\n        /// <summary>\r\n        /// the content of the message\r\n        /// </summary>\r\n        public string content;\r\n\r\n        /// <inheritdoc />\r\n        public override string ToJson()\r\n        {\r\n            JsonBuilder jb = new JsonBuilder();\r\n\r\n            jb.StartObject();\r\n            jb.Add(nameof(role), role.ToString());\r\n            jb.Add(nameof(content), content);\r\n            jb.EndObject();\r\n\r\n            return jb.ToString();\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public override void FromJson(JsonObject jsonObj)\r\n        {\r\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\r\n\r\n            foreach (JsonObject jo in jsonObj.NestedValues)\r\n            {\r\n                switch (jo.Name)\r\n                {\r\n                    case nameof(role):\r\n                        role = (MessageRole)Enum.Parse(typeof(MessageRole), jo.StringValue);\r\n                        break;\r\n                    case nameof(content):\r\n                        content = jo.StringValue;\r\n                        break;\r\n                    default:\r\n                        Debug.LogWarning(\"MessageV1: missing field \" + jo.Name);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/MessageV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 11813a2397ca53e4eb3115f2e5075e0c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/QuestionAnswerPairV1.cs",
    "content": "using OpenAi.Json;\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// <see cref=\"https://beta.openai.com/docs/api-reference/answers/create#answers/create-examples\"/>\n    /// </summary>\n    public class QuestionAnswerPairV1 : AModelV1\n    {\n        /// <summary>\n        /// The example that you are performing a search on\n        /// </summary>\n        public string question;\n\n        /// <summary>\n        /// The label that is used when trying to classify a prompt against an example\n        /// </summary>\n        public string answer;\n\n        public QuestionAnswerPairV1(string question, string answer)\n        {\n            this.question = question == null ? \"\" : question;\n            this.answer = answer == null ? \"\" : answer;\n        }\n\n        public QuestionAnswerPairV1() { }\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            if (json.NestedValues.Count != 2)\n                throw new OpenAiJsonException($\"Received badly formated {nameof(QuestionAnswerPairV1)} array\");\n\n            question = json.NestedValues[0].StringValue;\n            answer = json.NestedValues[1].StringValue;\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n            jb.AddArray(new string[] { question, answer });\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/QuestionAnswerPairV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3dbccebdcdfac4d4abab6bc2f80a310e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SearchListV1.cs",
    "content": "using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A list of searchs to perform in a OpenAi Api search query\n    /// </summary>\n    public class SearchListV1 : AModelV1\n    {\n        /// <summary>\n        /// The array of searches to perform\n        /// </summary>\n        public SearchV1[] data;\n\n        /// <summary>\n        /// The object type\n        /// </summary>\n        public string obj;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach(JsonObject jb in json.NestedValues)\n            {\n                switch (jb.Name) \n                {\n                    case nameof(data):\n                        data = new SearchV1[jb.NestedValues.Count];\n                        for(int i = 0; i<data.Length; i++)\n                        {\n                            SearchV1 sv1 = new SearchV1();\n                            sv1.FromJson(jb.NestedValues[i]);\n                            data[i] = sv1;\n                        }\n                        break;\n                    case \"object\":\n                        obj = jb.StringValue;\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n            jb.StartObject();\n            jb.AddArray(nameof(data), data);\n            jb.Add(\"object\", obj);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SearchListV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 953c9222a9a017f4187ac9b5d970ca91\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SearchV1.cs",
    "content": "using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A returned value from a GPT-3 search.\n    /// </summary>\n    public class SearchV1 : AModelV1\n    {\n        /// <summary>\n        /// The document searched\n        /// </summary>\n        public int document;\n        \n        /// <summary>\n        /// The object type\n        /// </summary>\n        public string obj;\n\n        /// <summary>\n        /// The score attributed to the document\n        /// </summary>\n        public float score;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach(JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(document):\n                        document = int.Parse(jo.StringValue);\n                        break;\n                    case \"object\":\n                        obj = jo.StringValue;\n                        break;\n                    case nameof(score):\n                        score = float.Parse(jo.StringValue);\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(document), document);\n            jb.Add(\"object\", obj);\n            jb.Add(nameof(score), score);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SearchV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5fe551b9c0b56c7498f23211afe62bd3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SelectedDocumentV1.cs",
    "content": "using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// <see cref=\"https://beta.openai.com/docs/api-reference/classifications/create#classifications/create-examples\"/>\n    /// </summary>\n    public class SelectedDocumentV1 : AModelV1\n    {\n        /// <summary>\n        /// The document the label is associated to\n        /// </summary>\n        public string document;\n\n        /// <summary>\n        /// The text assoicated with the document\n        /// </summary>\n        public string text;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach (JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(document):\n                        document = jo.StringValue;\n                        break;\n                    case nameof(text):\n                        text = jo.StringValue;\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(document), document);\n            jb.Add(nameof(text), text);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SelectedDocumentV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 47a4d2e28ecb6e44d9eeb5245fa92067\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SelectedExampleV1.cs",
    "content": "using OpenAi.Json;\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// <see cref=\"https://beta.openai.com/docs/api-reference/classifications/create#classifications/create-examples\"/>\n    /// </summary>\n    public class SelectedExampleV1 : AModelV1\n    {\n        /// <summary>\n        /// The document the label is associated to\n        /// </summary>\n        public string document;\n\n        /// <summary>\n        /// The label that is used when trying to classify a prompt against an example\n        /// </summary>\n        public string label;\n\n        /// <summary>\n        /// The example that you are performing a search on\n        /// </summary>\n        public string example;\n\n        /// <inheritdoc/>\n        public override void FromJson(JsonObject json)\n        {\n            foreach (JsonObject jo in json.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(document):\n                        document = jo.StringValue;\n                        break;\n                    case nameof(label):\n                        label = jo.StringValue;\n                        break;\n                    case nameof(example):\n                        example = jo.StringValue;\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(document), document);\n            jb.Add(nameof(label), label);\n            jb.Add(nameof(example), example);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/SelectedExampleV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e62fcf537ca59d941b63d2e1d78888b6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/UsageV1.cs",
    "content": "using OpenAi.Json;\n\nusing System;\nusing UnityEngine;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Part of completion response, count of i/o tokens\n    /// </summary>\n    [Serializable]\n    public class UsageV1 : AModelV1\n    {\n        /// <summary>\n        /// Prompt (input) token count\n        /// </summary>\n        public int prompt_tokens;\n\n        /// <summary>\n        /// Completion (output) token count\n        /// </summary>\n        public int completion_tokens;\n\n        /// <summary>\n        /// Total (i/o) token count\n        /// </summary>\n        public int total_tokens;\n\n        /// <inheritdoc />\n        public override string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(prompt_tokens), prompt_tokens);\n            jb.Add(nameof(completion_tokens), completion_tokens);\n            jb.Add(nameof(total_tokens), total_tokens);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n\n        /// <inheritdoc />\n        public override void FromJson(JsonObject jsonObj)\n        {\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\n\n            foreach (JsonObject jo in jsonObj.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(prompt_tokens):\n                        prompt_tokens = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(completion_tokens):\n                        completion_tokens = int.Parse(jo.StringValue);\n                        break;\n                    case nameof(total_tokens):\n                        total_tokens = int.Parse(jo.StringValue);\n                        break;\n                    default:\n                        Debug.LogWarning(\"UsageV1: missing field \" + jo.Name);\n                        break;\n                }\n            }\n        }\n\n        public static implicit operator UsageV1(JsonObject v)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models/UsageV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0c7eec027c8b1ef48a93712348658aa3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/Models.meta",
    "content": "fileFormatVersion: 2\nguid: 496e72bb847530346a4d6c7029c62ecf\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/OpenAiApiV1.cs",
    "content": "using System.Text;\n\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Entry point for all api calls to the OpenAi Api. Read the docs at <see href=\"https://beta.openai.com/docs/api-reference\"/>.\n    /// Api calls are managed using resource objects, which contain various calls that can be performed on that resource. \n    /// For example, <see cref=\"https://beta.openai.com/docs/api-reference/list-engines\"/> is the documentation for the list engines\n    /// api call. This is a GET request at https://api.openai.com/v1/engines. To make this call with the <see cref=\"OpenAiApiV1\"/> object,\n    /// the syntax is <c>OpenAiApiV1.Engines.List()</c>\n    /// </summary>\n    public class OpenAiApiV1 : IApiResource\n    {\n        private SAuthArgsV1 _authArgs;\n\n        /// <inheritdoc />\n        public IApiResource ParentResource => null;\n\n        /// <inheritdoc />\n        public string Endpoint => \"https://api.openai.com/v1\";\n\n        /// <inheritdoc />\n        public string Url => Endpoint;\n\n        /// <summary>\n        /// The Engines resources. <see href=\"https://beta.openai.com/docs/api-reference/list-engines\"/> \n        /// </summary>\n        public EnginesResourceV1 Engines { get; private set; }\n\n        /// <summary>\n        /// The Files resources. <see href=\"https://beta.openai.com/docs/api-reference/files\"/> \n        /// </summary>\n        public FilesResourceV1 Files { get; private set; }\n\n        /// <summary>\n        /// Chat resource. <see href=\"https://platform.openai.com/docs/api-reference/chat\"/>\n        /// </summary>\n        public ChatResourceV1 Chat { get; set; }\n\n        /// <summary>\n        /// Construct an <see cref=\"OpenAiApiV1\"/> with the provided auth args.\n        /// </summary>\n        /// <param name=\"authArgs\"></param>\n        public OpenAiApiV1(SAuthArgsV1 authArgs)\n        {\n            _authArgs = authArgs;\n            Engines = new EnginesResourceV1(this);\n            Files = new FilesResourceV1(this);\n            Chat = new ChatResourceV1(this);\n        }\n\n        /// <inheritdoc />\n        public void ConstructEndpoint(StringBuilder sb)\n        {\n            sb.Append(Endpoint);\n        }\n\n        /// <inheritdoc />\n        public void PopulateAuthHeaders(UnityWebRequest client)\n        {\n            client.SetRequestHeader(\"Authorization\", $\"Bearer {_authArgs.private_api_key}\");\n            client.SetRequestHeader(\"User-Agent\", $\"hexthedev/openai_api_unity\");\n            if (!string.IsNullOrEmpty(_authArgs.organization)) client.SetRequestHeader(\"OpenAI-Organization\", _authArgs.organization);\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/OpenAiApiV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b606a2a29008a6b4bb1e2cd1001ee7ab\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/SAuthArgsV1.cs",
    "content": "﻿using OpenAi.Json;\n\nusing System;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// Authentication arguments used to authenticate each api call to OpenAI\n    /// </summary>\n    public struct SAuthArgsV1 : IJsonable\n    {\n        /// <summary>\n        /// The private api key found at <see href=\"https://beta.openai.com/docs/developer-quickstart\"/>\n        /// </summary>\n        public string private_api_key;\n\n        /// <summary>\n        /// The organization id, used by individuals in multiple organizations to determine the quota to use\n        /// </summary>\n        public string organization;\n\n        /// <inheritdoc/>\n        public void FromJson(JsonObject jsonObj)\n        {\n            if (jsonObj.Type != EJsonType.Object) throw new Exception(\"Must be an object\");\n\n            foreach (JsonObject jo in jsonObj.NestedValues)\n            {\n                switch (jo.Name)\n                {\n                    case nameof(private_api_key):\n                        private_api_key = jo.StringValue;\n                        break;\n                    case nameof(organization):\n                        organization = jo.StringValue;\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public string ToJson()\n        {\n            JsonBuilder jb = new JsonBuilder();\n\n            jb.StartObject();\n            jb.Add(nameof(private_api_key), private_api_key);\n            jb.Add(nameof(organization), organization);\n            jb.EndObject();\n\n            return jb.ToString();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Api/V1/SAuthArgsV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c8f356b234ec21848a6894a17a7c7ee6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/_abstract/AModelV1.cs",
    "content": "﻿using OpenAi.Json;\n\nnamespace OpenAi.Api.V1\n{\n    /// <summary>\n    /// A model that can be converted from json and populated from json\n    /// </summary>\n    public abstract class AModelV1 : IJsonable\n    {\n        /// <inheritdoc />\n        public abstract void FromJson(JsonObject json);\n\n        /// <inheritdoc />\n        public abstract string ToJson();\n\n        public static T[] ArrayFromJson<T>(JsonObject parent) where T : AModelV1, new()\n        {\n            T[] newArray = new T[parent.NestedValues.Count];\n\n            for(int i = 0; i<parent.NestedValues.Count; i++)\n            {\n                T model = new T();\n                newArray[i] = model;\n                model.FromJson(parent.NestedValues[i]);\n            }\n\n            return newArray;\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/_abstract/AModelV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ba522051d42394b41914bd4c7a6a1acd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1/_abstract.meta",
    "content": "fileFormatVersion: 2\nguid: 581a3aadb5784a0449cbbbb0f8668752\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api/V1.meta",
    "content": "fileFormatVersion: 2\nguid: 3c1aa743ce2a9cc4591cebaa680af528\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Api.meta",
    "content": "fileFormatVersion: 2\nguid: 849e32b38a6fa064ca59d856b55c6368\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Examples/ExampleChatRuntime.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\nusing OpenAi.Unity.V1;\n\nnamespace OpenAi.Examples\n{\n    public class ExampleChatRuntime : MonoBehaviour\n    {\n        public Dropdown role;\n        public InputField Input;\n        public Text Output;\n\n        public void DoApiCompletion()\n        {\n            string text = Input.text;\n\n            if (string.IsNullOrEmpty(text))\n            {\n                Debug.LogError(\"Example requires input in input field\");\n                return;\n            }\n\n            Debug.Log(\"Performing Completion in Play Mode\");\n\n            Output.text = \"Perform Completion...\";\n            OpenAiChatCompleterV1.Instance.Complete(\n                text,\n                s => Output.text = s,\n                e => Output.text = $\"ERROR: StatusCode: {e.responseCode} - {e.error}\"\n            );\n        }\n\n        public void DoAddToDialogue()\n        {\n            Api.V1.MessageV1 message = new Api.V1.MessageV1();\n            message.role = (Api.V1.MessageV1.MessageRole)System.Enum.Parse(\n                typeof(Api.V1.MessageV1.MessageRole), role.options[role.value].text);\n            message.content = Input.text;\n            OpenAiChatCompleterV1.Instance.dialogue.Add(message);\n        }\n\n        public void QuitApp()\n        {\n            Application.Quit();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Examples/ExampleChatRuntime.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ac671c01496633846acf376026fb4b26\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Examples/ExampleOpenAiApiRuntime.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\nusing OpenAi.Unity.V1;\n\nnamespace OpenAi.Examples\n{\n    public class ExampleOpenAiApiRuntime : MonoBehaviour\n    {\n        public InputField Input;\n        public Text Output;\n\n        public void DoApiCompletion()\n        {\n            string text = Input.text;\n\n            if (string.IsNullOrEmpty(text))\n            {\n                Debug.LogError(\"Example requires input in input field\");\n                return;\n            }\n\n            Debug.Log(\"Performing Completion in Play Mode\");\n\n            Output.text = \"Perform Completion...\";\n            OpenAiCompleterV1.Instance.Complete(\n                text,\n                s => Output.text = s,\n                e => Output.text = $\"ERROR: StatusCode: {e.responseCode} - {e.error}\"\n            );\n        }\n\n        public void QuitApp()\n        {\n            Application.Quit();\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Examples/ExampleOpenAiApiRuntime.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0dffa08172edd254b9cd939b09f211a0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Examples.meta",
    "content": "fileFormatVersion: 2\nguid: 4f80f38abc299c1468fcc611b81d4486\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/JsonDeserializer.cs",
    "content": "using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Json\n{\n    public static class JsonDeserializer\n    {\n        public static JsonObject FromJson(string json)\n        {\n            string[] tokens = JsonLexer.Lex(json);\n            return JsonSyntaxAnalyzer.Parse(tokens);\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/JsonDeserializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b184cce1b528b70498079c2e1e689726\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/JsonObject.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace OpenAi.Json\n{\n    public class JsonObject\n    {\n        public EJsonType Type;\n        public string Name;\n        public string StringValue;\n        public List<JsonObject> NestedValues;\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/JsonObject.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2b80d53d968a1c74a8981b8b27a04a60\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/BaseAnalyzer.cs",
    "content": "﻿namespace OpenAi.Json\n{\n    /// <summary>\n    /// Basic character analyzer used during lexical analysis of json strings\n    /// </summary>\n    public class BaseAnalyzer : ICharacterAnalyzer\n    {\n        private StringAnalyzer stringAnalyzer = new StringAnalyzer();\n\n        /// <summary>\n        /// Categorizes characters in a json string, assuming they are now between \"\", and are\n        /// not a json string literal\n        /// </summary>\n        /// <param name=\"c\">Character to analyze</param>\n        /// <param name=\"engage\">returns <see cref=\"StringAnalyzer\"/> if character is a \"</param>\n        /// <returns>Analysis of character</returns>\n        public ECharacterAnalyzerResponse Analyze(char c, out ICharacterAnalyzer engage)\n        {\n            engage = null;\n\n            if (char.IsWhiteSpace(c)) return ECharacterAnalyzerResponse.ExcludeCharacter;\n\n            if( c == '{' || c == '}' || c == '[' || c == ']' || c == ',' || c == ':') // Add ':' as a Token to correctly process numerical values in JSON\n            {\n                return ECharacterAnalyzerResponse.Token;\n            }\n\n            if (c == '\"')\n            {\n                engage = stringAnalyzer;\n                return ECharacterAnalyzerResponse.EngageCharacter;\n            }\n\n            return ECharacterAnalyzerResponse.IncludeCharacter;\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/BaseAnalyzer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0c94ce4a5b7e273458068ae001f78c46\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/ECharacterAnalyzerResponse.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace OpenAi.Json\n{\n    /// <summary>\n    /// Possible character analysis results that can occur during deserailization\n    /// </summary>\n    public enum ECharacterAnalyzerResponse\n    {\n        /// <summary>\n        /// This character alone is a token and should be added directly\n        /// </summary>\n        Token,\n\n        /// <summary>\n        /// This character should be included in a token that is being generated\n        /// </summary>\n        IncludeCharacter,\n\n        /// <summary>\n        /// Using \\ as anchor, include escape character by skipping next character\n        /// </summary>\n        IncludeEscapeCharacter,\n\n        /// <summary>\n        /// This character should be excluded from token generation\n        /// </summary>\n        ExcludeCharacter,\n\n        /// <summary>\n        /// This character requires the engament of another analyzer, provided in out ICharacterAnalyzer\n        /// </summary>\n        EngageCharacter,\n\n        /// <summary>\n        /// This characher requires the release of the current analyzer and reversion to the last used analyzer\n        /// </summary>\n        ReleaseCharacter\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/ECharacterAnalyzerResponse.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cc2e08b043caa8f42b8698386306da36\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/ICharacterAnalyzer.cs",
    "content": "﻿namespace OpenAi.Json\n{\n    /// <summary>\n    /// Capable of analyzing a single character for the purpose of deserialization\n    /// </summary>\n    public interface ICharacterAnalyzer\n    {\n        /// <summary>\n        /// Analyzes a character and returns result based on the type of character it is.\n        /// </summary>\n        /// <param name=\"c\">The character to analyze</param>\n        /// <param name=\"engage\">The new character analyzer to engage, if the character represents the start of a unique section</param>\n        /// <returns></returns>\n        ECharacterAnalyzerResponse Analyze(char c, out ICharacterAnalyzer engage);\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/ICharacterAnalyzer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2b2a280e741cd7045a2351bd56b3222e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/StringAnalyzer.cs",
    "content": "﻿namespace OpenAi.Json\n{\n    /// <summary>\n    /// Analyzes characters that are between \" \" in a json string. \n    /// </summary>\n    public class StringAnalyzer : ICharacterAnalyzer\n    {\n        /// <summary>\n        /// Analyzes characters that are between \" \" in a json string. \n        /// </summary>\n        /// <param name=\"c\">Character is analyze</param>\n        /// <param name=\"engage\">Never used</param>\n        /// <returns>Analysis of character</returns>\n        public ECharacterAnalyzerResponse Analyze(char c, out ICharacterAnalyzer engage)\n        {\n            engage = null;\n            if (c == '\"') return ECharacterAnalyzerResponse.ReleaseCharacter;\n\n            if (c == '\\\\') return ECharacterAnalyzerResponse.IncludeEscapeCharacter;\n\n            return ECharacterAnalyzerResponse.IncludeCharacter;\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer/StringAnalyzer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3f4c1da055f011440928de92a8009ac8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/CharacterAnalyzer.meta",
    "content": "fileFormatVersion: 2\nguid: 02d8c26e86046ce48b1ba09aabeca34e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/JsonLexer.cs",
    "content": "using System.Collections.Generic;\nusing System.Text;\n\nnamespace OpenAi.Json\n{\n    /// <summary>\n    /// Simple single pass lexical analysis of a JSON string\n    /// </summary>\n    public static class JsonLexer\n    {\n        /// <summary>\n        /// Preforms a lexical analysis of a JSON string and returns an array of tokens.\n        /// </summary>\n        /// <param name=\"json\">json string to analyze</param>\n        /// <returns>array of tokens</returns>\n        public static string[] Lex(string json)\n        {\n            StringBuilder sb = new StringBuilder();\n            bool generatingToken = false;\n\n            Stack<ICharacterAnalyzer> analyzer = new Stack<ICharacterAnalyzer>();\n            analyzer.Push(new BaseAnalyzer());\n\n            List<string> tokens = new List<string>();\n\n            // Analyzes each character in the string based on the currently set analyzer. \n            // Based on analysis adds tokens to the tokens list.\n            for (int i = 0; i<json.Length; i++)\n            {\n                ECharacterAnalyzerResponse res = analyzer.Peek().Analyze(json[i], out ICharacterAnalyzer engage);\n\n                switch (res)\n                {\n                    case ECharacterAnalyzerResponse.Token:\n                        if (generatingToken) AddToken();\n                        tokens.Add($\"{json[i]}\");\n                        break;\n\n                    case ECharacterAnalyzerResponse.IncludeCharacter:\n                        if (!generatingToken) generatingToken = true;\n                        sb.Append(json[i]);\n                        break;\n\n                    case ECharacterAnalyzerResponse.IncludeEscapeCharacter:\n                        if (!generatingToken) generatingToken = true;\n                        sb.Append(json[i]);\n                        sb.Append(json[++i]);\n                        break;\n\n                    case ECharacterAnalyzerResponse.ExcludeCharacter:\n                        if (generatingToken) AddToken();\n                        break;\n\n                    // character to engage or release another analyzer\n                    case ECharacterAnalyzerResponse.EngageCharacter:\n                        if (generatingToken) AddToken();\n                        analyzer.Push(engage);\n                        break;\n\n                    case ECharacterAnalyzerResponse.ReleaseCharacter:\n                        AddToken();\n                        analyzer.Pop();\n                        break;\n                }\n            }\n\n            return tokens.ToArray();\n\n            void AddToken()\n            {\n                generatingToken = false;\n                tokens.Add(sb.ToString());\n                sb.Clear();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis/JsonLexer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c4c9520356e4cbb40a7be39f23f15c9e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/LexicalAnalysis.meta",
    "content": "fileFormatVersion: 2\nguid: fb9affc2655769d47b9be95f4d36b864\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/SyntacticAnalysis/EJsonType.cs",
    "content": "﻿namespace OpenAi.Json\n{\n    /// <summary>\n    /// Types of objects in json\n    /// </summary>\n    public enum EJsonType\n    {\n        /// <summary>\n        /// Simple value type. It may or may not have a key\n        /// </summary>\n        Value, \n        \n        /// <summary>\n        /// An object, or many \"key\":\"values\"\n        /// </summary>\n        Object, \n\n        /// <summary>\n        /// A list of indexed values\n        /// </summary>\n        List\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/SyntacticAnalysis/EJsonType.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b68cf8be6cf32ad4db5f6e93f25b0b6b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/SyntacticAnalysis/JsonSyntaxAnalyzer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace OpenAi.Json\n{\n    /// <summary>\n    /// Parses arrays of json tokens and outputs <see cref=\"JsonObject\"/>\n    /// </summary>\n    public static class JsonSyntaxAnalyzer\n    {\n        /// <summary>\n        /// Parse an array of json tokens\n        /// </summary>\n        /// <param name=\"syntax\">array of tokens</param>\n        /// <returns><see cref=\"JsonObject\"/> representation of deserialized object</returns>\n        public static JsonObject Parse(string[] syntax)\n        {\n            if (syntax == null || syntax.Length < 2) throw new OpenAiJsonException(\"Failed to parse syntax. Either null, or length < 2\");\n\n            JsonObject obj = new JsonObject();\n\n            switch (syntax[0])\n            {\n                case \"{\":\n                    obj.Type = EJsonType.Object;\n                    ParseObject(obj, syntax, 1);\n                    return obj;\n                case \"[\":\n                    obj.Type = EJsonType.List;\n                    ParseList(obj, syntax, 1);\n                    return obj;\n            }\n\n            throw new OpenAiJsonException(\"Failed to parse. Unknown error\");\n        }\n\n        private static int ParseObject(JsonObject parent, string[] syntax, int index)\n        {\n            // Handle empty object, i.e.: object: {}\n            if (syntax[index] == \"}\")\r\n            {\r\n                parent.NestedValues = new List<JsonObject>();\r\n                return index + 1;\r\n            }\n\n            int i = index;\n            for (; i<syntax.Length; i++)\n            {\n                i = ParseValue(parent, syntax, i);\n                if (syntax[i] == \"}\") return i + 1;\n            }\n            throw new OpenAiJsonException($\"Failed to parse object at token { syntax[i] }\");\n        }\n\n        private static int ParseList(JsonObject parent, string[] syntax, int index)\n        {\n            int i = index;\n            for (; i < syntax.Length; i++)\n            {\n                i = ParseListValue(parent, syntax, i);\n                if (syntax[i] == \"]\") return i + 1;\n            }\n            throw new OpenAiJsonException($\"Failed to parse list at token { syntax[i] }\");\n        }\n\n        private static int ParseValue(JsonObject parent, string[] syntax, int index)\n        {\n            // Validate\n            if (syntax[index + 1] != \":\") throw new OpenAiJsonException($\"Failed to value at token { syntax[index] } because it is not preceeded by a :, prceeded by { syntax[index+1] }\");\n\n            JsonObject val = new JsonObject();\n            val.Name = syntax[index];\n\n            if (parent.NestedValues == null) parent.NestedValues = new List<JsonObject>();\n            parent.NestedValues.Add(val);\n\n            switch (syntax[index + 2]) \n            {\n                case \"{\":\n                    val.Type = EJsonType.Object;\n                    return ParseObject(val, syntax, index + 3);\n                case \"[\":\n                    val.Type = EJsonType.List;\n                    return ParseList(val, syntax, index + 3);\n            }\n\n            val.Type = EJsonType.Value;\n            val.StringValue = syntax[index + 2];\n\n            return index + 3;\n        }\n\n        public static int ParseListValue(JsonObject parent, string[] syntax, int index)\n        {\n            // Validate\n            JsonObject val = new JsonObject();\n\n            if (parent.NestedValues == null) parent.NestedValues = new List<JsonObject>();\n            parent.NestedValues.Add(val);\n\n            switch (syntax[index])\n            {\n                case \"{\":\n                    val.Type = EJsonType.Object;\n                    return ParseObject(val, syntax, index + 1);\n                case \"[\":\n                    val.Type = EJsonType.List;\n                    return ParseList(val, syntax, index + 1);\n            }\n\n            val.Type = EJsonType.Value;\n            val.StringValue = syntax[index];\n\n            return index + 1;\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/SyntacticAnalysis/JsonSyntaxAnalyzer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b9500b3287886e4448a4acf15cc5ae51\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/SyntacticAnalysis.meta",
    "content": "fileFormatVersion: 2\nguid: 8383419f9ce52d7409b7908c9a889726\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/UTJsonDeserialization.cs",
    "content": "using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Json\n{\n    public static class UTJsonDeserialization\n    {\n        public static string[] AsStringArray(this JsonObject json)\n        {\n            if (json.Type == EJsonType.List)\n            {\n                List<string> extract = new List<string>();\n                foreach (JsonObject obj in json.NestedValues)\n                {\n                    extract.Add(obj.StringValue);\n                }\n                return extract.ToArray();\n            }\n            else\n            {\n                throw new OpenAiJsonException($\"Attempted to deserialize json to string[] but json object type is not a list. JSON: {json.StringValue}\");\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization/UTJsonDeserialization.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 85df79bde77a85b4185c17570a217d7a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Deserialization.meta",
    "content": "fileFormatVersion: 2\nguid: e55a05d8360bf9347b1c2d8b84b67fe4\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/IJsonable.cs",
    "content": "﻿namespace OpenAi.Json\n{\n    /// <summary>\n    /// Can be converted to and from json\n    /// </summary>\n    public interface IJsonable\n    {\n        /// <summary>\n        /// Convert the object to json format\n        /// </summary>\n        /// <returns>Object in json format string</returns>\n        string ToJson();\n\n        /// <summary>\n        /// Update the objects values based on JsonObject\n        /// </summary>\n        /// <param name=\"json\">JsonObject representing object instance</param>\n        void FromJson(JsonObject json);\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Json/IJsonable.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8a8e961569596a041a625bc8e5b76c5c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/OpenAiJsonException.cs",
    "content": "﻿using System;\nusing UnityEngine;\n\nnamespace OpenAi.Json\n{\n    /// <summary>\n    /// Exception thrown during json deserailization or serialization in the OpenAi Api Unity library\n    /// </summary>\n    public class OpenAiJsonException : Exception\n    {\n        /// <summary>\n        /// Constrct with message and inner exception\n        /// </summary>\n        /// <param name=\"message\">Message to show</param>\n        /// <param name=\"innerException\">Inner exception</param>\n        public OpenAiJsonException(string message, Exception innerException = null) : base(message, innerException)\n        {\n        }\n\n        /// <summary>\n        /// Print to Unity Log as errors\n        /// </summary>\n        public void LogAsError()\n        {\n            Debug.LogError($\"OpenAi Json Error: {Message}\");\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Json/OpenAiJsonException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3950378f7c31a764186e6c15c62014fb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Serialization/JsonBuilder.cs",
    "content": "using OpenAi.Api.V1;\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace OpenAi.Json\n{\n    /// <summary>\n    /// A bare-minimum Json string creation class geared towards creating JSON strings in the OpenAi Api. \n    /// </summary>\n    public class JsonBuilder\n    {\n        private StringBuilder _sb = new StringBuilder();\n        private bool _shouldAddComma = false;\n\n        private string _prefix => _shouldAddComma ? \",\" : \"\";\n\n        /// <summary>\n        /// Construct builder\n        /// </summary>\n        public JsonBuilder() { }\n\n        /// <summary>\n        /// Start object by adding {\n        /// </summary>\n        public void StartObject() => _sb.Append(\"{\");\n\n        /// <summary>\n        /// Start object by adding }\n        /// </summary>\n        public void EndObject() => _sb.Append(\"}\");\n\n        /// <summary>\n        /// Start list by adding [\n        /// </summary>\n        public void StartList() => _sb.Append(\"[\");\n\n        /// <summary>\n        /// Start list by adding ]\n        /// </summary>\n        public void EndList() => _sb.Append(\"]\");\n\n        /// <summary>\n        /// If not null, add int to json\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        public void Add(string name, int? val) => AddSimpleObject(name, val);\n\n        /// <summary>\n        /// If not null, add float to json\n        /// </summary>\n        public void Add(string name, float? val)\n        {\n            if (val != null)\n            {\n                float value = (float)val;\n                _sb.Append($\"{_prefix}\\\"{name}\\\":{value.ToString(CultureInfo.InvariantCulture)}\");\n                _shouldAddComma = true;\n            }\n        }\n        \n        /// <summary>\n        /// if not null, add bool to json\n        /// </summary>\n        public void Add(string name, bool? val)\n        {\n            if (val != null)\n            {\n                string valString = val == true ? \"true\" : \"false\";\n                _sb.Append($\"{_prefix}\\\"{name}\\\":{valString}\");\n                _shouldAddComma = true;\n            }\n        }\n\n        /// <summary>\n        /// if not null, add string to json\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        public void Add(string name, string val)\n        {\n            if (val != null)\n            {\n                _sb.Append($\"{_prefix}\\\"{name}\\\":{GetJsonString(val)}\");\n                _shouldAddComma = true;\n            }\n        }\n\n        /// <summary>\n        /// if not null, adds object to json by naively casting val to string\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        public void AddSimpleObject(string name, object val)\n        {\n            if (val != null)\n            {\n                _sb.Append($\"{_prefix}\\\"{name}\\\":{val}\");\n                _shouldAddComma = true;\n            }\n        }\n\n        /// <summary>\n        /// if not null, adds <see cref=\"StringOrArray\"/> to json\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        public void Add(string name, StringOrArray val)\n        {\n            if(val != null)\n            {\n                object valActual = val.Resolve();\n                string valString = \"\";\n\n                switch (valActual)\n                {\n                    case string s:\n                        valString = GetJsonString(s);\n                        break;\n                    case string[] a:\n                        //We send a list because we don't know how many non-null elements we have on the array\n                        List<string> arr = new List<string>();\n                        for(int i = 0; i<a.Length; i++)\n                        {\n                            if (a[i] != null)\n                            {\n                                arr.Add(GetJsonString(a[i]));\n                            }\n                        }\n                        valString = $\"[{string.Join(\",\", arr)}]\";\n                        break;\n                    default:\n                        throw new Exception(\"Failed to build StringOrArray\");\n                }\n\n                _sb.Append($\"{_prefix}\\\"{name}\\\":{valString}\");\n                _shouldAddComma = true;\n            }\n        }\n\n        /// <summary>\n        /// Adds a dictionary to json as a json object\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dict\"></param>\n        public void Add(string name, Dictionary<string, int> dict)\n        {\n            if (dict == null) return;\n\n            _sb.Append(_prefix);\n            _sb.Append($\"\\\"{name}\\\":\");\n\n            StartObject();\n            bool isFirst = true;\n            foreach(KeyValuePair<string, int> kv in dict)\n            {\n                if (!isFirst) _sb.Append(\",\");\n                _sb.Append($\"\\\"{kv.Key}\\\":{kv.Value}\");\n                if(isFirst) isFirst = false;\n            }\n            EndObject();\n        }\n\n        /// <summary>\n        /// Adds adds an array of <see cref=\"IJsonable\"/> objects as a json list\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"name\"></param>\n        /// <param name=\"value\"></param>\n        public void AddArray<T>(string name, T[] value) where T: IJsonable\n        {\n            if (value == null) return;\n\n            _sb.Append(_prefix);\n            _sb.Append($\"\\\"{name}\\\":\");\n\n            StartList();\n            string[] strings = new string[value.Length];\n            for(int i = 0; i<value.Length; i++)\n            {\n                strings[i] = value[i].ToJson();\n            }\n            _sb.Append(string.Join(\",\", strings));\n            EndList();\n\n            _shouldAddComma = true;\n        }\n\n        /// <summary>\n        /// Adds an array of strings as a json list\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"value\"></param>\n        public void AddArray(string name, string[] value)\n        {\n            if (value == null) return;\n\n            _sb.Append(_prefix);\n            _sb.Append($\"\\\"{name}\\\":\");\n\n            StartList();\n            string[] strings = new string[value.Length];\n            for (int i = 0; i < value.Length; i++)\n            {\n                strings[i] = GetJsonString(value[i]);\n            }\n            _sb.Append(string.Join(\",\", strings));\n            EndList();\n\n            _shouldAddComma = true;\n        }\n\n        /// <summary>\n        /// Adds an array to the json without applying a name. This is used for nested arrays\n        /// </summary>\n        public void AddArray(string[] values)\n        {\n            StartList();\n            string[] strings = new string[values.Length];\n            for (int i = 0; i < values.Length; i++)\n            {\n                strings[i] = GetJsonString(values[i]);\n            }\n            _sb.Append(string.Join(\",\", strings));\n            EndList();\n        }\n\n        /// <summary>\n        /// Write JsonBuilder value as string\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return _sb.ToString();\n        }\n\n        private string GetJsonString(string s) => $\"\\\"{ProcessString(s)}\\\"\";\n\n        private string ProcessString(string json)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            for(int i = 0; i<json.Length; i++)\n            {\n                sb.Append(ProcessJsonStringCharacter(json[i]));\n            }\n\n            return sb.ToString();\n        }\n\n        private string ProcessJsonStringCharacter(char character)\n        {\n            switch (character) \n            { \n                case '\\a': return \"\\\\a\";\n                case '\\b': return \"\\\\b\";\n                case '\\t': return \"\\\\t\";\n                case '\\r': return \"\\\\r\";\n                case '\\v': return \"\\\\v\";\n                case '\\f': return \"\\\\f\";\n                case '\\n': return \"\\\\n\";\n                case '\\\\': return \"\\\\\\\\\";\n                case '\\\"': return \"\\\\\\\"\";\n            }\n\n            return $\"{character}\";\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Json/Serialization/JsonBuilder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f58a6ffe2f7efa44bb6ea53136d36c37\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json/Serialization.meta",
    "content": "fileFormatVersion: 2\nguid: 0dd58324e1f4c44408aff4e58d73f178\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Json.meta",
    "content": "fileFormatVersion: 2\nguid: 274d1e33f0e24564abe020fdbf8a334c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/Util/AMonoSingleton.cs",
    "content": "﻿using UnityEngine;\n\nnamespace OpenAi.Unity\n{\n    /// <summary>\n    /// Implementation of Singleton for <see cref=\"MonoBehaviour\"/> that insures only a single instance\n    /// of the <see cref=\"MonoBehaviour\"/> exists in the scene, and that instance is not destroyed\n    /// between scene loads\n    /// </summary>\n    /// <typeparam name=\"T\">The type of the subclass.</typeparam>\n    public abstract class AMonoSingleton<T> : MonoBehaviour\n        where T : AMonoSingleton<T>\n    {\n        private static T _instance;\n\n        private static bool _instantiating = false;\n\n        private static bool AppQuitting { get; set; } = false;\n\n        /// <summary>\n        /// Singleton instance\n        /// </summary>\n        public static T Instance\n        {\n            get\n            {\n                if (AppQuitting)\n                {\n                    Debug.LogWarning($\"No {nameof(AMonoSingleton<T>)} returned because application is quiting\");\n                    return null;\n                }\n                TryCreateSingleton(_instance, ref _instance);\n                return _instance;\n            }\n        }\n\n        /// <summary>\n        /// <para>Tries to create a singleton. Succeeds if no instance has yet been created. Destroys any calling object that isn't the instance</para>\n        /// </summary>\n        /// <param name=\"caller\">The instance calling the function</param>\n        /// <param name=\"instanceVar\">A reference to the variable which holds the instance</param>\n        /// <returns>false if trying to create new instance</returns>\n        public static bool TryCreateSingleton(T caller, ref T instanceVar)\n        {\n            // if no instance created, can create\n            if (instanceVar == null)\n            {\n                // block used to catch other threads creating singleton\n                if (_instantiating)\n                {\n                    //Debug.LogWarning(\"Attempting to instantiate singleton, but _instantiation attempts indicate another thread is instantiating\");\n                    return false;\n                }\n                _instantiating = true;\n\n                // Check if there is a gameobject in the scene using the monobehaviour.\n                // If not make one\n                instanceVar = FindObjectOfType<T>();\n                if (instanceVar == null)\n                {\n                    instanceVar = new GameObject(typeof(T).Name + \"(AutoGenerated)\").AddComponent<T>();\n                }\n\n                // Mark Singleton not to be destroyed between scenes. DontDestroyOnLoad only works for root level objects\n                if (instanceVar.transform.parent != null) instanceVar.transform.SetParent(null);\n                DontDestroyOnLoad(instanceVar.gameObject);\n\n                return true;\n            }\n            else if (caller != instanceVar)\n            {\n                Destroy(caller);\n                return false;\n            }\n            return true;\n        }\n\n\n        private void OnApplicationQuit() => AppQuitting = true;\n\n        protected void Awake() => TryCreateSingleton((T)this, ref _instance);\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Unity/Util/AMonoSingleton.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d0f4f33e525c60b4faf9b337ef8ac5b6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/Util.meta",
    "content": "fileFormatVersion: 2\nguid: ea6ea4c33a049da4b96aef452604005f\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Auth/SOAuthArgsV1.cs",
    "content": "using OpenAi.Api;\nusing OpenAi.Api.V1;\nusing OpenAi.Json;\n\nusing System;\nusing System.IO;\nusing System.Text;\n\nusing UnityEngine;\n\nnamespace OpenAi.Unity.V1\n{\n    /// <summary>\n    /// The Authentication arguments required to authenticate an OpenAI Api request.\n    /// </summary>\n    /// <remarks>\n    /// Projects pushed to public reposities should not use the String authentication type, as the private key will be exposed to the public. \n    /// </remarks>\n    [CreateAssetMenu(fileName = \"AuthArgsV1\", menuName = \"OpenAi/Unity/V1/AuthArgs\")]\n    public class SOAuthArgsV1 : ScriptableObject\n    {\n        /// <summary>\n        /// The method by which the authentication and organization keys are supplied to the auth args.\n        /// </summary>\n        public EAuthProvisionMethod AuthType = EAuthProvisionMethod.LocalFile;\n\n        /// <summary>\n        /// The private key provided by OpenAi. You private api key can be found at <see href=\"https://beta.openai.com/docs/developer-quickstart/your-api-keys\"/> if you have an account.\n        /// </summary>\n        public string PrivateApiKey;\n\n        /// <summary>\n        /// The organization id provided by OpenAi. This is optional. It is only required when a user belongs to multiple organizations and they want to specifiy the organization who's quota should be consumed. \n        /// </summary>\n        public string Organization;\n\n        /// <summary>\n        /// Based on the <see cref=\"AuthType\"> resolves and provides the <see cref=\"SAuthArgsV1\"> instance\n        /// </summary>\n        /// <returns></returns>\n        public SAuthArgsV1 ResolveAuth()\n        {\n            switch (AuthType) \n            {\n                case EAuthProvisionMethod.LocalFile: return ResolveLocalFileAuthArgs();\n                case EAuthProvisionMethod.String: return new SAuthArgsV1() { private_api_key = PrivateApiKey, organization = Organization };\n            }\n\n            throw new Exception(\"Failed to resolve AuthArgs\");\n        }\n\n        private SAuthArgsV1 ResolveLocalFileAuthArgs()\n        {\n            string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);\n            string authPath = $\"{userPath}/.openai/auth.json\";\n            FileInfo fi = new FileInfo(authPath);\n\n            if (!fi.Exists) throw new OpenAiApiException($\"No authentication file exists at {authPath}\", this);\n\n            string json = null;\n            using (FileStream fs = fi.OpenRead())\n            {\n                byte[] buffer = new byte[fs.Length];\n                fs.Read(buffer, 0, (int)fs.Length);\n                json = Encoding.UTF8.GetString(buffer);\n            }\n\n            JsonObject des = JsonDeserializer.FromJson(json);\n\n            SAuthArgsV1 authArgs = new SAuthArgsV1();\n            authArgs.FromJson(des);\n\n            return authArgs;\n        }\n\n        /// <summary>\n        /// Options for provisioning auth keys\n        /// </summary>\n        public enum EAuthProvisionMethod\n        {\n            /// <summary>\n            /// The local file looks for a auth.json file located at `~/.openai/auth.json` (Linux/Mac)\n            /// or `%USERPROFILE%/.openai/auth.json` (Windows) and extracts the key.\n            /// </summary>\n            LocalFile = 0,\n\n            /// <summary>\n            /// The secret is copied into a field of this scriptable object and used directly\n            /// </summary>\n            String = 1\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Auth/SOAuthArgsV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 82cfa4d983a7d91419ea8999b972a333\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Auth.meta",
    "content": "fileFormatVersion: 2\nguid: 312fa3fc0c3c46b429ddafdc8fbadf33\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/ChatCompleter/OpenAiChatCompleterV1.cs",
    "content": "using OpenAi.Api;\nusing OpenAi.Api.V1;\n\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Unity.V1\n{\n    /// <summary>\n    /// Automatically handles setting up OpenAiApi for chat completions. Exposes a simple method to allow users to perform completions\n    /// </summary>\n    public class OpenAiChatCompleterV1 : AMonoSingleton<OpenAiChatCompleterV1>\n    {\n        OpenAiApiGatewayV1 _gateway = null;\n        ChatCompletionsResourceV1 _model = null;\n\n        /// <summary>\n        /// The auth arguments used to authenticate the api. Should not be changed after initalization. Once the <see cref=\"Api\"/> is initalized it must be cleared and initialized again if any changes are made to this property\n        /// </summary>\n        [Tooltip(\"Arguments used to authenticate the OpenAi Api\")]\n        public SOAuthArgsV1 Auth;\n\n        /// <summary>\n        /// Arguments used to configure the model when sending a chat completion\n        /// </summary>\n        [Tooltip(\"Arguments used to configure the chat completion\")]\n        public SOChatCompletionArgsV1 Args;\n\n        /// <summary>\n        /// The id of the model to use\n        /// </summary>\n        [Tooltip(\"The id of the model to use\")]\n        public EEngineName Model = EEngineName.gpt_35_turbo;\n\n        /// <summary>\n        /// Current model usage\n        /// </summary>\n        [Tooltip(\"Current model usage\")]\n        public UsageV1 Usage;\n\n        /// <summary>\n        /// The dialogue of chat messages, may be prepopulated\n        /// </summary>\n        [Tooltip(\"The dialogue of chat messages, may be prepopulated\")]\n        public List<MessageV1> dialogue;\n\n        public void Start()\n        {\n            _gateway = OpenAiApiGatewayV1.Instance;\n\n            if (Auth == null) Auth = ScriptableObject.CreateInstance<SOAuthArgsV1>();\n            if (Args == null) Args = ScriptableObject.CreateInstance<SOChatCompletionArgsV1>();\n\n            if (!_gateway.IsInitialized)\n            {\n                _gateway.Auth = Auth;\n                _gateway.InitializeApi();\n            }\n\n            _model = _gateway.Api.Chat.Completions;\n        }\n\n        public Coroutine Complete(string prompt, Action<string> onResponse, Action<UnityWebRequest> onError)\n        {\n            MessageV1 message = new MessageV1();\n            message.role = MessageV1.MessageRole.user;\n            message.content = prompt;\n\n            dialogue.Add(message);\n\n            return Complete(onResponse, onError);\n        }\n\n        public Coroutine Complete(Action<string> onResponse, Action<UnityWebRequest> onError)\n        {\n            ChatCompletionRequestV1 request = Args == null ?\n               new ChatCompletionRequestV1() :\n               Args.AsChatCompletionRequest();\n\n            request.model = UTEChatModelName.GetModelName(Model);\n            request.messages = dialogue;\n\n            return _model.CreateChatCompletionCoroutine(this, request, (r) => HandleResponse(r, onResponse, onError));\n        }\n\n        private void HandleResponse(ApiResult<ChatCompletionV1> result, Action<string> onResponse, Action<UnityWebRequest> onError)\n        {\n            if (result.IsSuccess)\n            {\n                foreach (ChatChoiceV1 choice in result.Result.choices)\n                {\n                    dialogue.Add(choice.message);\n                }\n\n                Usage = result.Result.usage;\n                onResponse(dialogue[dialogue.Count - 1].content);\n                return;\n            }\n            else\n            {\n                onError(result.HttpResponse);\n                return;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/ChatCompleter/OpenAiChatCompleterV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 582650b353200ef458d8ce61588f26dc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences:\n  - _auth: {fileID: 11400000, guid: 6d0ce71886a13d44a9693a5e31c0a754, type: 2}\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/ChatCompleter/SOChatCompletionArgsV1.cs",
    "content": "﻿using OpenAi.Api;\nusing OpenAi.Api.V1;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace OpenAi.Unity.V1\n{\n    /// <summary>\n    /// Arguments used to create a chat completion with the <see cref=\"OpenAiChatCompleterV1\"/>\n    /// </summary>\n    [CreateAssetMenu(fileName = \"ChatCompletionArgs\", menuName = \"OpenAi/Unity/V1/ChatCompletionArgs\")]\n    public class SOChatCompletionArgsV1 : ScriptableObject\n    {\n        [Tooltip(\"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or top_p but not both. \")]\n        public float temperature = 1;\n\n        [Tooltip(\"An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. \")]\n        public float top_p = 1;\n\n        [Tooltip(\"How many chat completion choices to generate for each input message.\")]\n        public int n = 1;\n\n        [Tooltip(\"If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a data: [DONE] message. See the OpenAI Cookbook for example code.\")]\n        bool stream = false;\n\n        [Tooltip(\"Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.\")]\n        public string[] stop = new string[4];\n\n        [Tooltip(\"The maximum number of tokens to generate in the chat completion. The total length of input tokens and generated tokens is limited by the model's context length.\")]\n        public int max_tokens = 4097;\n\n        [Tooltip(\"Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. \")]\n        public float presence_penalty = 0;\n\n        [Tooltip(\"Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.\")]\n        public float frequency_penalty = 0;\n\n        [Tooltip(\"Modify the likelihood of specified tokens appearing in the completion. Accepts a json object that maps tokens(specified by their token ID in the GPT tokenizer) to an associated bias value from - 100 to 100.\")]\n        public Dictionary<string, int> logit_bias = new Dictionary<string, int>();\n\n        [Tooltip(\"A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse.\")]\n        public string user = \"\";\n\n        public ChatCompletionRequestV1 AsChatCompletionRequest()\n        {\n            return new ChatCompletionRequestV1()\n            {\n                temperature = temperature,\n                top_p = top_p,\n                n = n,\n                stream = stream,\n                //stop = stop,\n                max_tokens = max_tokens,\n                presence_penalty = presence_penalty,\n                frequency_penalty = frequency_penalty,\n                // logit_bias = logit_bias,\n                user = user\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/ChatCompleter/SOChatCompletionArgsV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 080e53b2b28b9684d819081e4e9b9de6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/ChatCompleter.meta",
    "content": "fileFormatVersion: 2\nguid: 879144c005aec984c917ea92b9011d45\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Completer/OpenAiCompleterV1.cs",
    "content": "using OpenAi.Api;\nusing OpenAi.Api.V1;\n\nusing System;\n\nusing UnityEngine;\nusing UnityEngine.Networking;\n\nnamespace OpenAi.Unity.V1\n{\n    /// <summary>\n    /// Automatically handles setting up OpenAiApi for simple completions with 1 engine. Exposes a simple method to allow users to perform completions\n    /// </summary>\n    public class OpenAiCompleterV1 : AMonoSingleton<OpenAiCompleterV1>\n    {\n        OpenAiApiGatewayV1 _gateway = null;\n\n        EngineResourceV1 _engine = null;\n\n        /// <summary>\n        /// The auth arguments used to authenticate the api. Should not be changed after initalization. Once the <see cref=\"Api\"/> is initalized it must be cleared and initialized again if any changes are made to this property\n        /// </summary>\n        [Tooltip(\"Arguments used to authenticate the OpenAi Api\")]\n        public SOAuthArgsV1 Auth;\n\n        /// <summary>\n        /// Arguments used to configure the engine when sending a completion\n        /// </summary>\n        [Tooltip(\"Arguments used to configure the completion\")]\n        public SOCompletionArgsV1 Args;\n\n        /// <summary>\n        /// The id of the engine to use\n        /// </summary>\n        [Tooltip(\"The id of the engine to use\")]\n        public EEngineName Engine = EEngineName.text_davinci_003;\n\n        public void Start()\n        {\n            _gateway = OpenAiApiGatewayV1.Instance;\n\n            if (Auth == null) Auth = ScriptableObject.CreateInstance<SOAuthArgsV1>();\n            if (Args == null) Args = ScriptableObject.CreateInstance<SOCompletionArgsV1>();\n\n            if (!_gateway.IsInitialized) \n            {\n                _gateway.Auth = Auth;\n                _gateway.InitializeApi();\n            }\n\n            _engine = _gateway.Api.Engines.Engine(UTEEngineName.GetEngineName(Engine));\n        }\n\n        public Coroutine Complete(string prompt, Action<string> onResponse, Action<UnityWebRequest> onError)\n        {\n            CompletionRequestV1 request = Args == null ? \n                new CompletionRequestV1() { max_tokens = 64 } : \n                Args.AsCompletionRequest();\n\n            request.prompt = prompt;\n            return _engine.Completions.CreateCompletionCoroutine(this, request, (r) => HandleResponse(r, onResponse, onError));\n        }\n\n        private void HandleResponse(ApiResult<CompletionV1> result, Action<string> onResponse, Action<UnityWebRequest> onError)\n        {\n            if (result.IsSuccess)\n            {\n                onResponse(result.Result.choices[0].text);\n                return;\n            } \n            else\n            {\n                onError(result.HttpResponse);\n                return;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Completer/OpenAiCompleterV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 00b92053656ca0643ab0d4d86e1387fa\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences:\n  - _auth: {fileID: 11400000, guid: 6d0ce71886a13d44a9693a5e31c0a754, type: 2}\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Completer/SOCompletionArgsV1.cs",
    "content": "﻿using OpenAi.Api.V1;\n\nusing UnityEngine;\n\nnamespace OpenAi.Unity.V1\n{\n    /// <summary>\n    /// Arguments used to create a completion with the <see cref=\"OpenAiCompleterV1\"/>\n    /// </summary>\n    [CreateAssetMenu(fileName = \"CompletionArgs\", menuName = \"OpenAi/Unity/V1/CompletionArgs\")]\n    public class SOCompletionArgsV1 : ScriptableObject\n    {\n        [Tooltip(\"The maximum number of tokens to generate. Requests can use up to 2048 tokens shared between prompt and completion. (One token is roughly 4 characters for normal English text)\")]\n        public int max_tokens = 32;\n\n        [Tooltip(\"What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.\")]\n        public float temperature = 0.7f;\n\n        [Tooltip(\"An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.\")]\n        public float top_p = 1;\n\n        [Tooltip(\"Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.\")]\n        public string[] stop = new string[4];\n\n        [Tooltip(\"Number between 0 and 1 that penalizes new tokens based on whether they appear in the text so far. Increases the model's likelihood to talk about new topics. https://beta.openai.com/docs/api-reference/parameter-details/>\")]\n        public float presences_penalty = 0;\n\n        [Tooltip(\"Number between 0 and 1 that penalizes new tokens based on their existing frequency in the text so far. Decreases the model's likelihood to repeat the same line verbatim. https://beta.openai.com/docs/api-reference/parameter-details\")]\n        public float frequency_penalty = 0;\n\n        public CompletionRequestV1 AsCompletionRequest()\n        {\n            return new CompletionRequestV1()\n            {\n                max_tokens = max_tokens,\n                temperature = temperature,\n                top_p = top_p,\n                stop = \"\\n\",\n                frequency_penalty = frequency_penalty\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Completer/SOCompletionArgsV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6fd689c40e44326488e8c75b58e63175\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Completer.meta",
    "content": "fileFormatVersion: 2\nguid: 00b5ae1736e255341bc2b895c60c32e1\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Gateway/OpenAiApiGatewayV1.cs",
    "content": "using OpenAi.Api.V1;\n\nusing UnityEngine;\n\nnamespace OpenAi.Unity.V1\n{\n    /// <summary>\n    /// A singleton that handles the inialization of an OpenAiApiV1 object and provides access to it. For the <see cref=\"Api\"/> to function\n    /// it needs to be initalized.\n    /// </summary>\n    public class OpenAiApiGatewayV1 : AMonoSingleton<OpenAiApiGatewayV1>\n    {\n        /// <summary>\n        /// If true, calls <see cref=\"InitializeApi\"/> in <see cref=\"Start\"/>\n        /// </summary>\n        [Tooltip(\"If true, initalizes the api in Start. Otherwise requires initalization programmatically\")]\n        public bool InitializeOnStart = false;\n\n        /// <summary>\n        /// The auth arguments used to authenticate the api. Should not be changed after initalization. Once the <see cref=\"Api\"/> is initalized it must be cleared and initialized again if any changes are made to this property\n        /// </summary>\n        [Tooltip(\"Arguments used to authenticate the OpenAi Api\")]\n        public SOAuthArgsV1 Auth;\n\n        /// <summary>\n        /// True if the <see cref=\"Api\"/> has been initialized successfully and is ready for api calls to be made.\n        /// </summary>\n        public bool IsInitialized { get; private set; } = false;\n\n        /// <summary>\n        /// <see cref=\"OpenAiApiV1\"/> instance used the make api calls through internal resources.\n        /// </summary>\n        public OpenAiApiV1 Api { get; private set; }\n\n        void Start()\n        {\n            if (InitializeOnStart) InitializeApi();\n        }\n\n        /// <summary>\n        /// Sets the <see cref=\"Api\"/> by resolving <see cref=\"Auth\"/>\n        /// </summary>\n        public void InitializeApi()\n        {\n            if (Auth == null)\n            {\n                Debug.LogError(\"OpenAi API Error: OpenAi Api cannot be authenticated. No SOAuthArgs provided. API won't be created\");\n            }\n            else\n            {\n                Api = new OpenAiApiV1(Auth.ResolveAuth());\n                IsInitialized = true;\n            }\n        }\n\n        /// <summary>\n        /// Sets the <see cref=\"Api\"/> to null and marks <see cref=\"IsInitialized\"/> false\n        /// </summary>\n        public void ClearApi()\n        {\n            Api = null;\n            IsInitialized = false;\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Gateway/OpenAiApiGatewayV1.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2368cfe602a61dc47b9fceb48ea4dae0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences:\n  - _auth: {fileID: 11400000, guid: 6d0ce71886a13d44a9693a5e31c0a754, type: 2}\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1/Gateway.meta",
    "content": "fileFormatVersion: 2\nguid: 600ea62b57028514eb38209ef14ee650\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity/V1.meta",
    "content": "fileFormatVersion: 2\nguid: 848427f27c877f2408e2467479f7bc26\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts/Unity.meta",
    "content": "fileFormatVersion: 2\nguid: bf1dcfeb373d2a54e81e8addb04cc917\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: 44d4518f6fd7e54468095366e58d0ed9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/openai.api.unity.asmdef",
    "content": "{\n\t\"name\": \"openai.api.unity\"\n}\n"
  },
  {
    "path": "Runtime/openai.api.unity.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 762faf06f60fab647b9b71ae958fdf20\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: d210dc3ddd702344694f0b1256df17b7\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Core/V1/Models/CompletionRequestModelTests.cs",
    "content": "﻿using NUnit.Framework;\n\nnamespace OpenAi.Api.V1.Test\n{\n    class CompletionRequestModelTests\n    {\n        [Test]\n        public void ToJsonBase()\n        {\n            CompletionRequestV1 crm = new CompletionRequestV1()\n            {\n                stop = new StringOrArray(\"\\n\", \"a\"),\n                echo = true\n            };\n\n            string json = crm.ToJson();\n            string expected = \"{\\\"echo\\\":true,\\\"stop\\\":[\\\"\\\\n\\\",\\\"a\\\"]}\";\n\n            Assert.That(json == expected);\n        } \n    }\n}\n"
  },
  {
    "path": "Tests/Editor/Scripts/Core/V1/Models/CompletionRequestModelTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b6656729fe18ae4469079fb03627cffd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Core/V1/Models.meta",
    "content": "fileFormatVersion: 2\nguid: 3b0c87db33cf8044882d2709761ac89f\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Core/V1.meta",
    "content": "fileFormatVersion: 2\nguid: 501a01483ee15a643af8145511eca1b5\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Core.meta",
    "content": "fileFormatVersion: 2\nguid: 3ba5e0cafa5d7e74f8465aab852e6a54\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/JsonDeserializerTests.cs",
    "content": "﻿using NUnit.Framework;\r\n\r\nusing OpenAi.Json;\r\n\r\nusing UnityEngine.TestTools;\r\n\r\nnamespace OpenAiApi\r\n{\r\n    public class JsonDeserializerTests\r\n    {\r\n\r\n        [Test]\r\n        public void DeserializeTestEmpty()\r\n        {\r\n            string json = \"{}\";\r\n            JsonObject obj = JsonDeserializer.FromJson(json);\r\n\r\n            obj.AssertRootIsObject();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(0);\r\n        }\r\n\r\n        [Test]\r\n        public void DeserializeTestBasic()\r\n        {\r\n            string json = \"{\\\"key1\\\":\\\"val1\\\"}\";\r\n            JsonObject obj = JsonDeserializer.FromJson(json);\r\n\r\n            obj.AssertRootIsObject();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(1);\r\n\r\n            obj.NestedValues[0].AssertValue(\"key1\", \"val1\");\r\n        }\r\n\r\n        [Test]\r\n        public void DeserializeTestComplexe()\r\n        {\r\n            string json = \"{\\\"key1\\\":\\\"val1\\\", \\\"key2\\\":\\\"val2\\\", \\\"list1\\\":[\\\"li1\\n\\\", 67, 1.234], \\\"objt\\\" : { \\\"obj1\\\":\\\"ob1\\\", \\\"obj2\\\":\\\"ob2\\\", \\\"obj3\\\": [1, 1] }}\";\r\n            JsonObject obj = JsonDeserializer.FromJson(json);\r\n\r\n            Assert.IsNotNull(obj);\r\n\r\n            //AssertValue(obj.NestedValue[0], \"key1\", \"val1\");\r\n            //AssertValue(obj.NestedValue[1], \"key2\", \"val2\");\r\n            //AssertList(obj.NestedValue[2], \"list1\", \"li1\\n\", \"67\", \"1.234\");\r\n\r\n            JsonObject objt = obj.NestedValues[3];\r\n            Assert.That(objt.Type == EJsonType.Object);\r\n\r\n            //AssertValue(objt.NestedValue[0], \"obj1\", \"ob1\");\r\n            //AssertValue(objt.NestedValue[1], \"obj2\", \"ob2\");\r\n            //AssertList(objt.NestedValue[2], \"obj3\", \"1\", \"1\");\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "Tests/Editor/Scripts/Json/JsonDeserializerTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 223bf5360d26a5e409c6c8ecc05c83a8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/LexicalAnalysis/JsonLexerTests.cs",
    "content": "using NUnit.Framework;\n\nusing OpenAi.Json;\n\nnamespace OpenAiApi\n{\n    public class JsonLexerTests\n    {\n        [Test]\n        public void LexerTestSimpleObject()\n        {\n            string[] lex = JsonLexer.Lex(\"{\\\"key\\\":\\\"value\\\"}\");\n\n            Assert.IsNotNull(lex);\n\n            string[] expected = new string[] { \"{\", \"key\", \":\", \"value\", \"}\" };\n            for (int i = 0; i < expected.Length; i++) Assert.That(lex[i] == expected[i]);\n        }\n\n        [Test]\n        public void LexerTestSimpleList()\n        {\n            string[] lex = JsonLexer.Lex(\"[\\\"li1\\\",\\\"li2\\\"]\");\n\n            Assert.IsNotNull(lex);\n\n            string[] expected = new string[] { \"[\", \"li1\", \",\", \"li2\", \"]\" };\n            for (int i = 0; i < expected.Length; i++) Assert.That(lex[i] == expected[i]);\n        }\n\n        [Test]\n        public void LexerTestListOfObjects()\n        {\n            string[] lex = JsonLexer.Lex(\"[{\\\"key1\\\":\\\"val1\\\"},{\\\"key2\\\":\\\"val2\\\"}]\");\n\n            Assert.IsNotNull(lex);\n\n            string[] expected = new string[] { \"[\", \"{\", \"key1\", \":\", \"val1\", \"}\", \",\", \"{\", \"key2\", \":\", \"val2\", \"}\", \"]\" };\n            for (int i = 0; i < expected.Length; i++) Assert.That(lex[i] == expected[i]);\n        }\n\n        [Test]\n        public void LexerTestObjectWithListValue()\n        {\n            string[] lex = JsonLexer.Lex(\"{\\\"key1\\\":[\\\"li1\\\",\\\"li2\\\"]}\");\n\n            Assert.IsNotNull(lex);\n\n            string[] expected = new string[] { \"{\", \"key1\", \":\", \"[\", \"li1\", \",\", \"li2\", \"]\", \"}\" };\n            for (int i = 0; i < expected.Length; i++) Assert.That(lex[i] == expected[i]);\n        }\n\n        // A Test behaves as an ordinary method\n        [Test]\n        public void LexerTestOpenAiExample()\n        {\n            string[] lex = JsonLexer.Lex(\"{\\\"id\\\":    \\\"cmpl - uqkvlQyYK7bGYrRHQ0eXlWi7\\\",\\\"object\\\": \\\"text_completion\\\", \\\"created\\\":     1589478378,\\\"model\\\":    \\\"davinci:2020-05-03\\\",\\\"choices\\\": [{\\\"text\\\": \\\" there was a girl who\\\",\\\"index\\\":  0,\\\"logprobs\\\": null,\\\"finish_reason\\\":    \\\"length\\\"}]}  \");\n\n            Assert.IsNotNull(lex);\n\n            string[] expected = new string[] { \"{\", \"id\", \":\", \"cmpl - uqkvlQyYK7bGYrRHQ0eXlWi7\", \",\", \"object\", \":\", \"text_completion\", \",\", \"created\", \":\", \"1589478378\", \",\", \"model\", \":\", \"davinci:2020-05-03\", \",\", \"choices\", \":\", \"[\", \"{\", \"text\", \":\", \" there was a girl who\", \",\", \"index\", \":\", \"0\", \",\", \"logprobs\", \":\", \"null\", \",\", \"finish_reason\", \":\", \"length\", \"}\", \"]\", \"}\" };\n\n            for (int i = 0; i < expected.Length; i++) Assert.That(lex[i] == expected[i]);\n        }\n    }\n}"
  },
  {
    "path": "Tests/Editor/Scripts/Json/LexicalAnalysis/JsonLexerTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1e8417b673afe434b9ddcf90a69adc80\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/LexicalAnalysis.meta",
    "content": "fileFormatVersion: 2\nguid: 5c5edb816bdb80c4da0a30f99d889942\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/SyntacticAnalysis/JsonSyntaxAnalyzerTests.cs",
    "content": "﻿using NUnit.Framework;\r\n\r\nusing OpenAi.Json;\r\n\r\nusing System.Collections.Generic;\r\n\r\nnamespace OpenAiApi\r\n{\r\n    class SyntaxAnalyzerTests\r\n    {\r\n        [Test]\r\n        public void AnalyzeTestEmptyObject()\r\n        {\r\n            string[] syntax = new string[]\r\n           {\r\n                \"{\",  \"}\"\r\n           };\r\n\r\n            JsonObject obj = JsonSyntaxAnalyzer.Parse(syntax);\r\n\r\n            obj.AssertRootIsObject();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(0);\r\n        }\r\n\r\n        [Test]\r\n        public void AnalyzeTestSimpleObject()\r\n        {\r\n            string[] syntax = new string[]\r\n            {\r\n                \"{\", \"key\", \":\", \"value\", \"}\"\r\n            };\r\n\r\n            JsonObject obj = JsonSyntaxAnalyzer.Parse(syntax);\r\n\r\n            obj.AssertRootIsObject();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(1);\r\n\r\n            obj.NestedValues[0].AssertValue(\"key\", \"value\");\r\n        }\r\n\r\n        [Test]\r\n        public void AnalyzeTestSimpleList()\r\n        {\r\n            string[] syntax = new string[]\r\n            {\r\n                \"[\", \"li1\", \",\", \"li2\", \"]\"\r\n            };\r\n\r\n            JsonObject obj = JsonSyntaxAnalyzer.Parse(syntax);\r\n\r\n            obj.AssertRootIsList();\r\n            obj.AssertListWithSimpleValues(null, \"li1\", \"li2\");\r\n        }\r\n\r\n        [Test]\r\n        public void AnalyzeTestListOfObjects()\r\n        {\r\n            string[] syntax = new string[]\r\n            {\r\n                \"[\", \"{\", \"key0\", \":\", \"val0\", \"}\", \",\", \"{\", \"key1\", \":\", \"val1\", \"}\", \"]\"\r\n            };\r\n\r\n            JsonObject obj = JsonSyntaxAnalyzer.Parse(syntax);\r\n\r\n            obj.AssertRootIsList();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(2);\r\n\r\n            for(int i = 0; i<=1; i++)\r\n            {\r\n                // Test the object\r\n                JsonObject listElement = obj.NestedValues[i];\r\n                listElement.AssertListElementIsObject();\r\n                listElement.NestedValues.AssertIsValidJsonObjectArray(1);\r\n\r\n                // Test the objects inner key value pair\r\n                JsonObject objectKeyValue = listElement.NestedValues[0];\r\n                objectKeyValue.AssertValue($\"key{i}\", $\"val{i}\");\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void AnalyzeTestWithListValue()\r\n        {\r\n            string[] syntax = new string[]\r\n            {\r\n                \"{\", \"key1\", \":\", \"[\", \"li1\", \",\", \"li2\", \"]\", \"}\"\r\n            };\r\n\r\n            JsonObject obj = JsonSyntaxAnalyzer.Parse(syntax);\r\n\r\n            obj.AssertRootIsObject();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(1);\r\n\r\n            // Test the value with list\r\n            JsonObject val = obj.NestedValues[0];\r\n            val.AssertListWithSimpleValues(\"key1\", \"li1\", \"li2\");\r\n        }\r\n\r\n        [Test]\r\n        public void AnalyzeTestOpenAiExample()\r\n        {\r\n            string[] syntax = new string[]\r\n            {\r\n                \"{\", \"id\", \":\", \"cmpl - uqkvlQyYK7bGYrRHQ0eXlWi7\", \",\", \"object\", \":\", \"text_completion\", \",\", \"created\", \":\", \"1589478378\", \",\", \"model\", \":\", \"davinci:2020-05-03\", \",\", \"choices\", \":\", \"[\", \"{\", \"text\", \":\", \" there was a girl who\", \",\", \"index\", \":\", \"0\", \",\", \"logprobs\", \":\", \"null\", \",\", \"finish_reason\", \":\", \"length\", \"}\", \"]\", \"}\"\r\n            };\r\n\r\n            JsonObject obj = JsonSyntaxAnalyzer.Parse(syntax);\r\n\r\n            // Root\r\n            obj.AssertRootIsObject();\r\n            obj.NestedValues.AssertIsValidJsonObjectArray(5);\r\n\r\n            // First few values\r\n            obj.NestedValues[0].AssertValue(\"id\", \"cmpl - uqkvlQyYK7bGYrRHQ0eXlWi7\");\r\n            obj.NestedValues[1].AssertValue(\"object\", \"text_completion\");\r\n            obj.NestedValues[2].AssertValue(\"created\", \"1589478378\");\r\n            obj.NestedValues[3].AssertValue(\"model\", \"davinci:2020-05-03\");\r\n\r\n            // Choices list object\r\n            JsonObject list = obj.NestedValues[4];\r\n            list.AssertList(1);\r\n\r\n            // The one choices object inside the list\r\n            JsonObject choiceObject = list.NestedValues[0];\r\n            choiceObject.AssertListElementIsObject();\r\n            choiceObject.NestedValues.AssertIsValidJsonObjectArray(4);\r\n\r\n            List<JsonObject> choiceObjectKVs = choiceObject.NestedValues;\r\n            choiceObjectKVs[0].AssertValue(\"text\", \" there was a girl who\");\r\n            choiceObjectKVs[1].AssertValue(\"index\", \"0\");\r\n            choiceObjectKVs[2].AssertValue(\"logprobs\", \"null\");\r\n            choiceObjectKVs[3].AssertValue(\"finish_reason\", \"length\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/SyntacticAnalysis/JsonSyntaxAnalyzerTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5b9e21e2bfd24ae4380d3800e3af2738\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/SyntacticAnalysis.meta",
    "content": "fileFormatVersion: 2\nguid: b2b410013ccbb7f469706eac37366419\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json/UTJsonObjectTests.cs",
    "content": "using NUnit.Framework;\n\nusing OpenAi.Json;\n\nusing System.Collections.Generic;\n\nnamespace OpenAiApi\n{\n    public static class UTJsonObjectTests\n    {\n        /// <summary>\n        /// Asserts that a JsonObject is the root, and is an object type\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        public static void AssertRootIsObject(this JsonObject obj)\n        {\n            Assert.IsNotNull(obj);\n            Assert.That(obj.Name == null);\n            Assert.That(obj.Type == EJsonType.Object);\n        }\n\n        /// <summary>\n        /// Asserts that a JsonObject is the root, and is a list type\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        public static void AssertRootIsList(this JsonObject obj)\n        {\n            Assert.IsNotNull(obj);\n            Assert.That(obj.Name == null);\n            Assert.That(obj.Type == EJsonType.List);\n        }\n\n        /// <summary>\n        /// Asserts that a JsonObject is a value, and verifies the name and val\n        /// of the JsonObject\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        /// <returns></returns>\n        public static void AssertValue(this JsonObject obj, string name, string val)\n        {\n            Assert.IsNotNull(obj);\n            Assert.That(obj.Type == EJsonType.Value);\n            Assert.That(obj.Name == name);\n            Assert.That(obj.StringValue == val);\n        }\n\n        /// <summary>\n        /// Asserts that the object is a list of a certain size, but does not check the element values\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        /// <returns></returns>\n        public static void AssertList(this JsonObject obj, int count)\n        {\n            Assert.IsNotNull(obj);\n            Assert.That(obj.Type == EJsonType.List);\n            obj.NestedValues.AssertIsValidJsonObjectArray(count);\n        }\n\n        /// <summary>\n        /// Asserts that a JsonObject is a list of values, and verifies the name of the object\n        /// and the value of each list member\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        /// <returns></returns>\n        public static void AssertListWithSimpleValues(this JsonObject obj, string name, params string[] vals)\n        {\n            Assert.IsNotNull(obj);\n            Assert.That(obj.Type == EJsonType.List);\n            Assert.That(obj.Name == name);\n\n            for (int i = 0; i < obj.NestedValues.Count; i++)\n            {\n                Assert.IsNotNull(obj.NestedValues[i]);\n                Assert.That(obj.NestedValues[i].Type == EJsonType.Value);\n                Assert.That(vals[i] == obj.NestedValues[i].StringValue);\n            }\n        }\n\n        /// <summary>\n        /// Asserts that a JsonObject is an object that is in a list. This means the object has no name\n        /// since it's a list value and has an index instead. \n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"val\"></param>\n        /// <returns></returns>\n        public static void AssertListElementIsObject(this JsonObject obj)\n        {\n            Assert.IsNotNull(obj);\n            Assert.That(obj.Type == EJsonType.Object);\n        }\n\n        /// <summary>\n        /// Asserts that a JsonObject array is not null and of a certain size\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        public static void AssertIsValidJsonObjectArray(this List<JsonObject> objs, int count)\n        {\n            Assert.IsNotNull(objs);\n            Assert.That(objs.Count == count);\n        }\n    }\n}"
  },
  {
    "path": "Tests/Editor/Scripts/Json/UTJsonObjectTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b7b5972f4d2ad7f4a95e57fdce251dd1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts/Json.meta",
    "content": "fileFormatVersion: 2\nguid: 50d1d1ceda820ca46a345407951b1cfc\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: ff968cb2f1f71924eb57b584ce2568de\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor/openai.api.unity.editor.tests.asmdef",
    "content": "{\n    \"name\": \"openai.api.unity.editor.tests\",\n    \"references\": [\n        \"UnityEngine.TestRunner\",\n        \"UnityEditor.TestRunner\",\n        \"openai.api.unity\",\n        \"openai.api.unity.tests\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": true,\n    \"precompiledReferences\": [\n        \"nunit.framework.dll\"\n    ],\n    \"autoReferenced\": false,\n    \"defineConstraints\": [\n        \"UNITY_INCLUDE_TESTS\"\n    ],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Tests/Editor/openai.api.unity.editor.tests.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 5786b1a7a94f11943b8a6d85a558e577\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 0e5915828fe8d7b45af787f69cd45855\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts/Core/V1/V1BugTests.cs",
    "content": "﻿using NUnit.Framework;\n\nusing OpenAi.Api.V1;\nusing OpenAi.Unity.V1;\n\nusing System.Collections;\n\nusing UnityEngine;\nusing UnityEngine.Networking;\nusing UnityEngine.TestTools;\n\nnamespace OpenAi.Api.Test\n{\n    public class V1BugTests\n    {\n        private TestManager test;\n        private OpenAiApiV1 api;\n\n        [OneTimeSetUp]\n        public void OneTimeSetup() => test = TestManager.Instance;\n\n        [SetUp]\n        public void SetUp() => api = test.CleanAndProvideApi();\n\n        [UnityTest]\n        // Issue: https://github.com/hexthedev/OpenAi-Api-Unity/issues/7\n        // Prompts weren't working with escape characters\n        public IEnumerator Issue007_EscapeCharacterBug()\n        {\n            ApiResult<CompletionV1> result = null;\n            yield return api.Engines.Engine(\"ada\").Completions.CreateCompletionCoroutine(\n                test, \n                new CompletionRequestV1() { prompt = \"something\\r\\n\", max_tokens = 8 },\n                (r) => result = r\n            );\n\n            Assert.That(test.TestApiResultHasResponse(result));\n        }\n\n        [UnityTest]\n        // Issue: https://github.com/hexthedev/OpenAi-Api-Unity/issues/10\n        // For some reason the completer is logging twice\n        public IEnumerator Issue010_CompleterLoggingTwice()\n        {\n            OpenAiCompleterV1 comp = OpenAiCompleterV1.Instance;\n            yield return new WaitForEndOfFrame();\n            \n            int count = 0;\n            string res = null;\n            UnityWebRequest err = null;\n            yield return OpenAiCompleterV1.Instance.Complete(\n                \"test\", extractRes, extractErr\n            );\n\n            int count2 = count;\n            string res2 = res;\n            UnityWebRequest err2 = err;\n\n            bool resIsNotNull = res != null;\n            test.LogTest(\"A response was received by the first request\", resIsNotNull);\n\n            bool errIsNull = err == null;\n            test.LogTest(\"The web request is null\", errIsNull);\n\n            bool only1requestHappened = count == 1;\n            test.LogTest(\"Only 1 request happened\", only1requestHappened);\n\n            Assert.That(resIsNotNull && errIsNull && only1requestHappened);\n\n            void extractRes(string r)\n            {\n                res = r;\n                count++;\n            } \n\n            void extractErr(UnityWebRequest e)\n            {\n                err = e;\n                count++;\n            }\n        }\n\n        [UnityTest]\n        // Issue: https://github.com/hexthedev/OpenAi-Api-Unity/issues/13\n        // Prompts weren't working multiline strings\n        public IEnumerator Issue013_MultilineStringBug()\n        {\n            string multiprompt = @\"test\n\"\"Are these an isse\"\"\n<how about these />\n\";\n\n            ApiResult<CompletionV1> result = null;\n            yield return api.Engines.Engine(\"ada\").Completions.CreateCompletionCoroutine(\n                test,\n                new CompletionRequestV1() { prompt = multiprompt, max_tokens = 8 },\n                (r) => result = r\n            );\n\n            Assert.That(test.TestApiResultHasResponse(result));\n        }\n    }\n}"
  },
  {
    "path": "Tests/Runtime/Scripts/Core/V1/V1BugTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 86b352fb947b61a41a1d13d30b0e844d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts/Core/V1/V1PlayTests.cs",
    "content": "﻿using NUnit.Framework;\r\n\r\nusing OpenAi.Api.V1;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Threading.Tasks;\r\n\r\nusing UnityEngine;\r\nusing UnityEngine.TestTools;\r\n\r\nnamespace OpenAi.Api.Test\r\n{\r\n    public class V1PlayTests\r\n    {\r\n        private TestManager test;\r\n        private OpenAiApiV1 api;\r\n\r\n        [OneTimeSetUp]\r\n        public void OneTimeSetup() => test = TestManager.Instance;\r\n\r\n        [SetUp]\r\n        public void SetUp() => api = test.CleanAndProvideApi();\r\n\r\n        #region Engines Requests\r\n        [UnityTest]\r\n        public IEnumerator EnginesListCoroutine()\r\n        {\r\n            ApiResult<EnginesListV1> result = null;\r\n            yield return api.Engines.ListEnginesCoroutine(test, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool isDataNotEmpty = result.Result.data != null;\r\n            test.LogTest(\"Data is not empty\", isDataNotEmpty);\r\n\r\n            bool containsAda = false;\r\n            foreach (EngineV1 engine in result.Result.data)\r\n            {\r\n                if (engine.id == \"ada\")\r\n                {\r\n                    containsAda = true;\r\n                    break;\r\n                }\r\n            }\r\n            test.LogTest(\"Engine id contains \\\"ada\\\"\", containsAda);\r\n\r\n            Assert.That(isDataNotEmpty && containsAda);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator EnginesListAsync()\r\n        {\r\n            Task<ApiResult<EnginesListV1>> resTask = api.Engines.ListEnginesAsync();\r\n\r\n            while (!resTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            ApiResult<EnginesListV1> res = resTask.Result;\r\n\r\n            if (!test.TestApiResultHasResponse(res)) Assert.That(false);\r\n\r\n            bool isResultDataNotEmpty = res.Result.data != null && res.Result.data.Length > 0;\r\n            test.LogTest(\"Result data is not empty\", isResultDataNotEmpty);\r\n\r\n            Assert.That(isResultDataNotEmpty);\r\n        }\r\n        #endregion\r\n\r\n        #region Engine Requests\r\n        [UnityTest]\r\n        public IEnumerator EngineRetrieveCoroutine()\r\n        {\r\n            ApiResult<EngineV1> result = null;\r\n            yield return api.Engines.Engine(\"ada\").RetrieveEngineCoroutine(test, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool isResultIdAda = result.Result.id == \"ada\";\r\n            test.LogTest(\"The result id is ada\", isResultIdAda);\r\n\r\n            Assert.That(isResultIdAda);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator EngineRetrieveAsync()\r\n        {\r\n            Task<ApiResult<EngineV1>> resultTask = api.Engines.Engine(\"ada\").RetrieveEngineAsync();\r\n\r\n            while (!resultTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            ApiResult<EngineV1> result = resultTask.Result;\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool isResultIdAda = result.Result.id == \"ada\";\r\n            test.LogTest(\"The result id is ada\", isResultIdAda);\r\n\r\n            Assert.That(isResultIdAda);\r\n        }\r\n        #endregion\r\n\r\n        #region Completion Requests\r\n        [UnityTest]\r\n        public IEnumerator Completions_TestAllRequestParamsString()\r\n        {\r\n            ApiResult<CompletionV1> result = null;\r\n\r\n            CompletionRequestV1 req = new CompletionRequestV1()\r\n            {\r\n                prompt = \"hello\",\r\n                best_of = 1,\r\n                echo = false,\r\n                frequency_penalty = 0,\r\n                presence_penalty = 0,\r\n                logit_bias = new Dictionary<string, int>() { { \"123\", -100 }, { \"111\", 100 } },\r\n                stop = \"###\",\r\n                logprobs = 0,\r\n                stream = false,\r\n                max_tokens = 8,\r\n                n = 1,\r\n                temperature = 0,\r\n                top_p = 1\r\n            };\r\n\r\n            yield return api.Engines.Engine(\"ada\").Completions.CreateCompletionCoroutine(test, req, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool doesResultObjectExist = result.Result.choices != null && result.Result.choices.Length > 0;\r\n            test.LogTest(\"Does non empty result object exist\", doesResultObjectExist);\r\n\r\n            Assert.That(doesResultObjectExist);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator Completions_TestAllRequestParamsArray()\r\n        {\r\n            ApiResult<CompletionV1> result = null;\r\n\r\n            CompletionRequestV1 req = new CompletionRequestV1()\r\n            {\r\n                prompt = new string[] { \"prompt1\", \"prompt2\" },\r\n                best_of = 1,\r\n                echo = false,\r\n                frequency_penalty = 0,\r\n                presence_penalty = 0,\r\n                logit_bias = new Dictionary<string, int>() { { \"123\", -100 }, { \"111\", 100 } },\r\n                stop = new string[] { \"stop1\", \"stop2\" },\r\n                logprobs = 0,\r\n                stream = false,\r\n                max_tokens = 8,\r\n                n = 1,\r\n                temperature = 0,\r\n                top_p = 1\r\n            };\r\n\r\n            yield return api.Engines.Engine(\"ada\").Completions.CreateCompletionCoroutine(test, req, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool doesResultObjectExist = result.Result.choices != null && result.Result.choices.Length > 0;\r\n            test.LogTest(\"Does non empty result object exist\", doesResultObjectExist);\r\n\r\n            Assert.That(doesResultObjectExist);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator CompletionsCreateCoroutine()\r\n        {\r\n            ApiResult<CompletionV1> result = null;\r\n            CompletionRequestV1 req = new CompletionRequestV1() { prompt = \"hello\", n = 8 };\r\n            yield return api.Engines.Engine(\"ada\").Completions.CreateCompletionCoroutine(test, req, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n            bool doesResultObjectExist = result.Result.choices != null && result.Result.choices.Length > 0;\r\n            test.LogTest(\"Does non empty result object exist\", doesResultObjectExist);\r\n\r\n            Assert.That(doesResultObjectExist);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator CompletionsCreateAsync()\r\n        {\r\n            Task<ApiResult<CompletionV1>> resTask = api.Engines.Engine(\"ada\").Completions.CreateCompletionAsync(\r\n                new CompletionRequestV1() { prompt = \"hello\", max_tokens = 8 }\r\n            );\r\n\r\n            while (!resTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            ApiResult<CompletionV1> res = resTask.Result;\r\n\r\n            Assert.That(test.TestApiResultHasResponse(res));\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator CompletionsCreateCoroutine_EventStream()\r\n        {\r\n            ApiResult<CompletionV1> result = null;\r\n            List<CompletionV1> partials = new List<CompletionV1>();\r\n            bool isComplete = false;\r\n\r\n            CompletionRequestV1 req = new CompletionRequestV1() { prompt = \"hello\", n = 8 };\r\n            yield return api.Engines.Engine(\"ada\").Completions.CreateCompletionCoroutine_EventStream(\r\n                test,\r\n                req,\r\n                (r) => result = r,\r\n                (i, l) => partials.Add(l),\r\n                () => isComplete = true\r\n            );\r\n\r\n            float timer = 10f;\r\n            while (!isComplete && timer > 0)\r\n            {\r\n                timer -= Time.deltaTime;\r\n                yield return new WaitForEndOfFrame();\r\n            }\r\n\r\n            test.LogTest(\"Stream was completed\", isComplete);\r\n\r\n            if (!test.TestApiResultSuccess(result)) Assert.That(false);\r\n\r\n            bool partialsNotEmpty = partials != null && partials.Count > 0;\r\n            test.LogTest(\"Partial reponses were received\", partialsNotEmpty);\r\n\r\n            Assert.That(isComplete && partialsNotEmpty);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator CompletionsCreateAsync_EventStream()\r\n        {\r\n            ApiResult<CompletionV1> result = null;\r\n            List<CompletionV1> completions = new List<CompletionV1>();\r\n            bool isComplete = false;\r\n\r\n            Task engineTask = api.Engines.Engine(\"davinci\").Completions.CreateCompletionAsync_EventStream(\r\n                new CompletionRequestV1() { prompt = \"hello\", max_tokens = 8, stream = true },\r\n                (r) => result = r,\r\n                (i, c) => completions.Add(c),\r\n                () => isComplete = true\r\n            );\r\n\r\n            while (!engineTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            test.LogTest(\"Stream was completed\", isComplete);\r\n\r\n            if (!test.TestApiResultSuccess(result)) Assert.That(false);\r\n\r\n            bool completionsNotEmpty = completions != null && completions.Count > 0;\r\n            test.LogTest(\"Partial reponses were received\", completionsNotEmpty);\r\n\r\n            Assert.That(isComplete && completionsNotEmpty);\r\n        }\r\n        #endregion\r\n\r\n        #region Chat Completion Requests\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletions_TestAllRequestParamsString()\r\n        {\r\n            ApiResult<ChatCompletionV1> result = null;\r\n\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"hello\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages,\r\n                frequency_penalty = 0,\r\n                presence_penalty = 0,\r\n                logit_bias = new Dictionary<string, int>() { { \"123\", -100 }, { \"111\", 100 } },\r\n                stop = \"###\",\r\n                stream = false,\r\n                max_tokens = 8,\r\n                n = 1,\r\n                temperature = 0,\r\n                top_p = 1,\r\n                user = \"\"\r\n            };\r\n\r\n            yield return api.Chat.Completions.CreateChatCompletionCoroutine(test, req, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool doesResultObjectExist = result.Result.choices != null && result.Result.choices.Length > 0;\r\n            test.LogTest(\"Does non empty result object exist\", doesResultObjectExist);\r\n\r\n            Assert.That(doesResultObjectExist);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletions_TestAllRequestParamsArray()\r\n        {\r\n            ApiResult<ChatCompletionV1> result = null;\r\n\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"hello\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages,\r\n                frequency_penalty = 0,\r\n                presence_penalty = 0,\r\n                logit_bias = new Dictionary<string, int>() { { \"123\", -100 }, { \"111\", 100 } },\r\n                stop = new string[] { \"stop1\", \"stop2\" },\r\n                stream = false,\r\n                max_tokens = 8,\r\n                n = 1,\r\n                temperature = 0,\r\n                top_p = 1,\r\n                user = \"\"\r\n            };\r\n\r\n            yield return api.Chat.Completions.CreateChatCompletionCoroutine(test, req, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n\r\n            bool doesResultObjectExist = result.Result.choices != null && result.Result.choices.Length > 0;\r\n            test.LogTest(\"Does non empty result object exist\", doesResultObjectExist);\r\n\r\n            Assert.That(doesResultObjectExist);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletionsCreateCoroutine()\r\n        {\r\n            ApiResult<ChatCompletionV1> result = null;\r\n\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"hello\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages,\r\n                n = 8\r\n            };\r\n\r\n            yield return api.Chat.Completions.CreateChatCompletionCoroutine(test, req, (r) => result = r);\r\n\r\n            if (!test.TestApiResultHasResponse(result)) Assert.That(false);\r\n            bool doesResultObjectExist = result.Result.choices != null && result.Result.choices.Length > 0;\r\n            test.LogTest(\"Does non empty result object exist\", doesResultObjectExist);\r\n\r\n            Assert.That(doesResultObjectExist);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletionsCreateAsync()\r\n        {\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"hello\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages,\r\n                max_tokens = 8\r\n            };\r\n\r\n            Task<ApiResult<ChatCompletionV1>> resTask = api.Chat.Completions.CreateChatCompletionAsync(req);\r\n\r\n            while (!resTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            ApiResult<ChatCompletionV1> res = resTask.Result;\r\n\r\n            Assert.That(test.TestApiResultHasResponse(res));\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletionsCreateCoroutine_EventStream()\r\n        {\r\n            ApiResult<ChatCompletionV1> result = null;\r\n            List<ChatCompletionV1> partials = new List<ChatCompletionV1>();\r\n            bool isComplete = false;\r\n\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"hello\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages,\r\n                max_tokens = 8\r\n            };\r\n\r\n            yield return api.Chat.Completions.CreateChatCompletionCoroutine_EventStream(\r\n                test,\r\n                req,\r\n                (r) => result = r,\r\n                (i, l) => partials.Add(l),\r\n                () => isComplete = true\r\n            );\r\n\r\n            float timer = 10f;\r\n            while (!isComplete && timer > 0)\r\n            {\r\n                timer -= Time.deltaTime;\r\n                yield return new WaitForEndOfFrame();\r\n            }\r\n\r\n            test.LogTest(\"Stream was completed\", isComplete);\r\n\r\n            if (!test.TestApiResultSuccess(result)) Assert.That(false);\r\n\r\n            bool partialsNotEmpty = partials != null && partials.Count > 0;\r\n            test.LogTest(\"Partial reponses were received\", partialsNotEmpty);\r\n\r\n            Assert.That(isComplete && partialsNotEmpty);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletionsCreateAsync_EventStream()\r\n        {\r\n            ApiResult<ChatCompletionV1> result = null;\r\n            List<ChatCompletionV1> completions = new List<ChatCompletionV1>();\r\n            bool isComplete = false;\r\n\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"hello\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages,\r\n                max_tokens = 8,\r\n                stream = true\r\n            };\r\n\r\n            Task engineTask = api.Chat.Completions.CreateChatCompletionAsync_EventStream(\r\n                req,\r\n                (r) => result = r,\r\n                (i, c) => completions.Add(c),\r\n                 () => isComplete = true\r\n            );\r\n\r\n            while (!engineTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            test.LogTest(\"Stream was completed\", isComplete);\r\n\r\n            if (!test.TestApiResultSuccess(result)) Assert.That(false);\r\n\r\n            bool completionsNotEmpty = completions != null && completions.Count > 0;\r\n            test.LogTest(\"Partial reponses were received\", completionsNotEmpty);\r\n\r\n            Assert.That(isComplete && completionsNotEmpty);\r\n        }\r\n\r\n        [UnityTest]\r\n        public IEnumerator ChatCompletionsCreateAsync_Multiple()\r\n        {\r\n            MessageV1 message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.system;\r\n            message.content = \"You are Yoda from Star Wars.\";\r\n\r\n            List<MessageV1> messages = new List<MessageV1>();\r\n            messages.Add(message);\r\n\r\n            message = new MessageV1();\r\n            message.role = MessageV1.MessageRole.user;\r\n            message.content = \"Is Vader good or evil?\";\r\n            messages.Add(message);\r\n\r\n            ChatCompletionRequestV1 req = new ChatCompletionRequestV1()\r\n            {\r\n                model = \"gpt-3.5-turbo\",\r\n                messages = messages\r\n            };\r\n\r\n            Task<ApiResult<ChatCompletionV1>> resTask = api.Chat.Completions.CreateChatCompletionAsync(req);\r\n\r\n            while (!resTask.IsCompleted) yield return new WaitForEndOfFrame();\r\n\r\n            ApiResult<ChatCompletionV1> res = resTask.Result;\r\n\r\n            Assert.That(test.TestApiResultHasResponse(res));\r\n        }\r\n        #endregion\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "Tests/Runtime/Scripts/Core/V1/V1PlayTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2c42900de9f02ee48af3c3d4f42e6f36\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts/Core/V1.meta",
    "content": "fileFormatVersion: 2\nguid: fb6fb4f46e6b0d74290f8811c3b4b8ca\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts/Core.meta",
    "content": "fileFormatVersion: 2\nguid: 6123089993dd31c4e95f28d6b1a4ea08\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts/Utility/TestManager.cs",
    "content": "﻿using OpenAi.Unity;\nusing OpenAi.Unity.V1;\nusing OpenAi.Api.V1;\n\nusing UnityEngine;\n\nnamespace OpenAi.Api.Test\n{\n    public class TestManager : AMonoSingleton<TestManager>\n    {\n        private OpenAiApiGatewayV1 _apiGateway = null;\n\n        public OpenAiApiV1 CleanAndProvideApi()\n        {\n            if(_apiGateway != null)\n            {\n                Destroy(_apiGateway.gameObject);\n                _apiGateway = null;\n            }\n            \n            _apiGateway = OpenAiApiGatewayV1.Instance;\n            _apiGateway.Auth = ScriptableObject.CreateInstance<SOAuthArgsV1>();\n            _apiGateway.Auth.AuthType = SOAuthArgsV1.EAuthProvisionMethod.LocalFile;\n            _apiGateway.InitializeApi();\n\n            return _apiGateway.Api;\n        }\n\n        public void LogTest(string testDescription, bool result)\n        {\n            if (result)\n            {\n                Debug.Log($\"[SUCCESS] {testDescription}\");\n            }\n            else\n            {\n                Debug.Log($\"[FAIL] {testDescription}\");\n            }\n        }\n\n        public bool TestApiResultSuccess(ApiResult result)\n        {\n            bool resultIsNotNull = result != null;\n            LogTest(\"Result is not null\", resultIsNotNull);\n            if (!resultIsNotNull) return false;\n\n            bool resultIsSuccess = result.IsSuccess;\n            LogTest(\"Result is success\", resultIsSuccess);\n            return resultIsNotNull && resultIsSuccess;\n        }\n\n        public bool TestApiResultHasResponse<T>(ApiResult<T> result)\n        {\n            if (!TestApiResultSuccess(result)) return false;\n\n            bool resultDataIsNotNull = result.Result != null;\n            LogTest(\"Result data is not null\", resultDataIsNotNull);\n            return resultDataIsNotNull;\n        }\n    }\n}"
  },
  {
    "path": "Tests/Runtime/Scripts/Utility/TestManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d5af3e7604a64fc48a09cd9c35c52761\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts/Utility.meta",
    "content": "fileFormatVersion: 2\nguid: c416749ed6215ba4c942296b750293a5\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: 90068a42ae1f929488453d252586f75d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime/openai.api.unity.tests.asmdef",
    "content": "{\n    \"name\": \"openai.api.unity.tests\",\n    \"rootNamespace\": \"\",\n    \"references\": [\n        \"UnityEngine.TestRunner\",\n        \"UnityEditor.TestRunner\",\n        \"openai.api.unity\"\n    ],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": true,\n    \"precompiledReferences\": [\n        \"nunit.framework.dll\"\n    ],\n    \"autoReferenced\": false,\n    \"defineConstraints\": [\n        \"UNITY_INCLUDE_TESTS\"\n    ],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Tests/Runtime/openai.api.unity.tests.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: fc54d62c1ca99e743bf1d95c40e63e49\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests/Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: ce5d35051f4a3a443ae48ed52729c1c8\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Tests.meta",
    "content": "fileFormatVersion: 2\nguid: 3062c48fbb54dac4a97a5a800a5ab3b7\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "package.json",
    "content": "{\"name\": \"com.openai.api.unity\", \"version\": \"0.2.12\", \"displayName\": \"OpenAi Api Unity\", \"description\": \"An OpenAi Api for the Unity Engine\", \"unity\": \"2020.3\", \"unityRelease\": \"0f1\", \"dependencies\": {}, \"keywords\": [\"OpenAi\"], \"author\": {\"name\": \"James McCafferty\", \"email\": \"jamesmccafferty@live.ca\", \"url\": \"https://github.com/hexthedev/OpenAi-Api-Unity\"}}"
  },
  {
    "path": "package.json.meta",
    "content": "fileFormatVersion: 2\nguid: 9bdc328e9c2659345a872bec307bca2d\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  }
]