diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 594e039..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Autonomous Empirical Research Initiative - -Permission 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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE 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. \ No newline at end of file diff --git a/README.md b/README.md index f99bb27..ed45fac 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,12 @@ A declarative language in python for creating jsPsych experiments. This is a partner product intended to use alongside sweetPea (https://github.com/sweetpea-org/sweetpea-py) but can also be used as standalone product. -This project is in active development by the Autonomous Empirical Research Group - (package developer: Younes Strittmatter, PI: Sebastian Musslick) in collaboration with the Center for Computation and Visualization at Brown University. This research program is supported by Schmidt Science Fellows, in partnership with the Rhodes Trust, as well as the Carney BRAINSTORM program at Brown University. - +This project is in active development by the Autonomous +Empirical Research Group +(package developer: Younes Strittmatter, PI: Sebastian Musslick) in collaboration +with the Center for Computation and Visualization at Brown University. This +research program is supported by Schmidt Science Fellows, in partnership with the Rhodes Trust, as well as the Carney +BRAINSTORM program at Brown University. # install diff --git a/examples/AI Experiment/Psychometric.ipynb b/examples/AI Experiment/Psychometric.ipynb new file mode 100644 index 0000000..ecc2ff3 --- /dev/null +++ b/examples/AI Experiment/Psychometric.ipynb @@ -0,0 +1,460 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-11-08T12:53:54.588949Z", + "start_time": "2024-11-08T12:53:53.234526Z" + } + }, + "source": [ + "import time\n", + "\n", + "from google_api import generate\n", + "from llama_api import generate_llama" + ], + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:53:54.593454Z", + "start_time": "2024-11-08T12:53:54.590100Z" + } + }, + "cell_type": "code", + "source": [ + "import random\n", + "\n", + "\n", + "def create_prompt(coherence, number_of_dots, direction,\n", + " preamble=None, appendix=None):\n", + " prompt = ''\n", + " if preamble is None:\n", + " preamble = 'In this task you see dots moving. Please indicate the main direction of the dots. You can only look at one point at a time. You look at some of the dots one after each other. Here is how they move:'\n", + " if appendix is None:\n", + " appendix = 'Please indicate the main direction of the dots. Please respond left or right and nothing else. Your response should be in the form of a single word. Either \"left\" or \"right\".'\n", + " prompt += preamble\n", + " if abs(coherence * number_of_dots - round(coherence * number_of_dots)) > 0.004:\n", + " raise ValueError('coherence * number_of_dots must be an integer')\n", + " if direction == 'right':\n", + " trials = ['This dot is moving right.'] * int(number_of_dots * coherence)\n", + " trials += ['This dot is moving left.'] * int(number_of_dots * (1-coherence))\n", + " else:\n", + " trials = ['This dot is moving left.'] * int(number_of_dots * coherence)\n", + " trials += ['This dot is moving right.'] * int(number_of_dots * (1-coherence))\n", + " random.shuffle(trials)\n", + " for trial in trials:\n", + " prompt += ' ' + trial\n", + " prompt += ' ' + appendix\n", + " return prompt" + ], + "id": "8372161593d0e270", + "outputs": [], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:53:54.721586Z", + "start_time": "2024-11-08T12:53:54.594211Z" + } + }, + "cell_type": "code", + "source": "create_prompt(.5, 5, 'left')", + "id": "aad25a5303f18d15", + "outputs": [ + { + "ename": "ValueError", + "evalue": "coherence * number_of_dots must be an integer", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mValueError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[5], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mcreate_prompt\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m.5\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m5\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mleft\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\n", + "Cell \u001B[0;32mIn[4], line 13\u001B[0m, in \u001B[0;36mcreate_prompt\u001B[0;34m(coherence, number_of_dots, direction, preamble, appendix)\u001B[0m\n\u001B[1;32m 11\u001B[0m prompt \u001B[38;5;241m+\u001B[39m\u001B[38;5;241m=\u001B[39m preamble\n\u001B[1;32m 12\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mabs\u001B[39m(coherence \u001B[38;5;241m*\u001B[39m number_of_dots \u001B[38;5;241m-\u001B[39m \u001B[38;5;28mround\u001B[39m(coherence \u001B[38;5;241m*\u001B[39m number_of_dots)) \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m0.004\u001B[39m:\n\u001B[0;32m---> 13\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mcoherence * number_of_dots must be an integer\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m 14\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m direction \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mright\u001B[39m\u001B[38;5;124m'\u001B[39m:\n\u001B[1;32m 15\u001B[0m trials \u001B[38;5;241m=\u001B[39m [\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mThis dot is moving right.\u001B[39m\u001B[38;5;124m'\u001B[39m] \u001B[38;5;241m*\u001B[39m \u001B[38;5;28mint\u001B[39m(number_of_dots \u001B[38;5;241m*\u001B[39m coherence)\n", + "\u001B[0;31mValueError\u001B[0m: coherence * number_of_dots must be an integer" + ] + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:53:55.633740Z", + "start_time": "2024-11-08T12:53:55.630595Z" + } + }, + "cell_type": "code", + "source": [ + "def get_accuracy(response, direction):\n", + " return response.lower() in direction or direction in response.lower()" + ], + "id": "ed0e1510130e469b", + "outputs": [], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:53:56.216706Z", + "start_time": "2024-11-08T12:53:56.207793Z" + } + }, + "cell_type": "code", + "source": [ + "p, _ = create_prompt(.55, 100, 'right')\n", + "generate(p)" + ], + "id": "7063a5f36627f1", + "outputs": [ + { + "ename": "ValueError", + "evalue": "too many values to unpack (expected 2)", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mValueError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[7], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m p, _ \u001B[38;5;241m=\u001B[39m create_prompt(\u001B[38;5;241m.55\u001B[39m, \u001B[38;5;241m100\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mright\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m 2\u001B[0m generate(p)\n", + "\u001B[0;31mValueError\u001B[0m: too many values to unpack (expected 2)" + ] + } + ], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:53:57.536210Z", + "start_time": "2024-11-08T12:53:57.532717Z" + } + }, + "cell_type": "code", + "source": [ + "# coherences = [.5, .51, .52, .53, .54, .55, .56, .57, .58, .59, .6,.62,.64, .65,.68,.7,.72,.74,.76, .8, .9,1.]\n", + "coherences =[.5, .51,.52,.54, .58, .6,.61,.62,.63,.64, .65,.66, .67,.7, .8, .9, 1.]\n", + "coherences = [.5, .51,.52, .53, .54, .55,.56,.57,.58,.59,\n", + " .6, .61,.62, .63, .64, .65,.66,.67,.68,.69,\n", + " .7, .71,.72, .73, .74, .75,.76,.77,.78,.79,\n", + " .8, .81,.82, .83, .84, .85,.86,.87,.88,.89,\n", + " .9, .91,.92, .93, .94, .95,.96,.97,.98,.99, 1.]\n", + "directions = ['left', 'right']\n", + "num_of_dots = 100\n", + "num_trials = 100" + ], + "id": "196552f68baca802", + "outputs": [], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:56:45.950587Z", + "start_time": "2024-11-08T12:55:31.056610Z" + } + }, + "cell_type": "code", + "source": [ + "import time\n", + "import json\n", + "with open('psychometric.json', 'r') as f:\n", + " data = json.load(f)\n", + " \n", + "is_sleep = False\n", + "# model = 'llama3.1-70b'\n", + "# model = 'mixtral-8x22b'\n", + "# model = 'llama2-7b'\n", + "models = ['llama3.1-70b', 'llama2-7b', 'llama3-8b', 'gemini-1.5-flash-002', 'gemini-1.0-pro-001']\n", + "models = ['llama3.1-70b', 'gemini-1.5-flash-002', 'gemini-1.0-pro-001']\n", + "models = ['llama3.1-70b']\n", + "models = ['llama3-8b']\n", + "\n", + "# model = 'llama3-8b'\n", + "i = 0\n", + "for _ in range(num_trials):\n", + " for direction in directions: \n", + " for coherence in coherences:\n", + " prompt= create_prompt(coherence, num_of_dots, direction)\n", + " model = random.choice(models)\n", + " if 'gemini' in model:\n", + " response = generate(prompt)\n", + " else:\n", + " response = generate_llama(prompt, model)\n", + " accuracy = get_accuracy(response, direction)\n", + " if is_sleep:\n", + " time.sleep(4)\n", + " data['coherence'].append(coherence)\n", + " data['direction'].append(direction)\n", + " data['num_of_dots'].append(num_of_dots)\n", + " data['prompt'].append(prompt)\n", + " data['response'].append(response)\n", + " data['accuracy'].append(accuracy)\n", + " data['model'].append(model)\n", + " print('.', end='')\n", + " i+=1\n", + " if not i % len(coherences):\n", + " print('')\n", + " with open('psychometric.json', 'w') as f:\n", + " json.dump(data, f)" + ], + "id": "67a6cfdb0721636a", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "...................................................\n", + "." + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[16], line 25\u001B[0m\n\u001B[1;32m 23\u001B[0m response \u001B[38;5;241m=\u001B[39m generate(prompt)\n\u001B[1;32m 24\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m---> 25\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[43mgenerate_llama\u001B[49m\u001B[43m(\u001B[49m\u001B[43mprompt\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmodel\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 26\u001B[0m accuracy \u001B[38;5;241m=\u001B[39m get_accuracy(response, direction)\n\u001B[1;32m 27\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m is_sleep:\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/examples/AI Experiment/llama_api.py:10\u001B[0m, in \u001B[0;36mgenerate_llama\u001B[0;34m(prompt, model, max_tokens)\u001B[0m\n\u001B[1;32m 9\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mgenerate_llama\u001B[39m(prompt, model\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mllama3.1-70b\u001B[39m\u001B[38;5;124m\"\u001B[39m, max_tokens\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m5\u001B[39m):\n\u001B[0;32m---> 10\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[43mclient\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mchat\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mcompletions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mcreate\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 11\u001B[0m \u001B[43m \u001B[49m\u001B[43mmodel\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmodel\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 12\u001B[0m \u001B[43m \u001B[49m\u001B[43mmessages\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m[\u001B[49m\n\u001B[1;32m 13\u001B[0m \u001B[43m \u001B[49m\u001B[43m{\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mrole\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43muser\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mcontent\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mprompt\u001B[49m\u001B[43m}\u001B[49m\n\u001B[1;32m 14\u001B[0m \u001B[43m \u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 15\u001B[0m \u001B[43m \u001B[49m\u001B[43mmax_tokens\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmax_tokens\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 16\u001B[0m \u001B[43m \u001B[49m\u001B[43mtemperature\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m1\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[1;32m 17\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 19\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m response\u001B[38;5;241m.\u001B[39mchoices[\u001B[38;5;241m0\u001B[39m]\u001B[38;5;241m.\u001B[39mmessage\u001B[38;5;241m.\u001B[39mcontent\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/openai/_utils/_utils.py:275\u001B[0m, in \u001B[0;36mrequired_args..inner..wrapper\u001B[0;34m(*args, **kwargs)\u001B[0m\n\u001B[1;32m 273\u001B[0m msg \u001B[38;5;241m=\u001B[39m \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mMissing required argument: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mquote(missing[\u001B[38;5;241m0\u001B[39m])\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m 274\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m(msg)\n\u001B[0;32m--> 275\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/openai/resources/chat/completions.py:829\u001B[0m, in \u001B[0;36mCompletions.create\u001B[0;34m(self, messages, model, audio, frequency_penalty, function_call, functions, logit_bias, logprobs, max_completion_tokens, max_tokens, metadata, modalities, n, parallel_tool_calls, prediction, presence_penalty, response_format, seed, service_tier, stop, store, stream, stream_options, temperature, tool_choice, tools, top_logprobs, top_p, user, extra_headers, extra_query, extra_body, timeout)\u001B[0m\n\u001B[1;32m 788\u001B[0m \u001B[38;5;129m@required_args\u001B[39m([\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmessages\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmodel\u001B[39m\u001B[38;5;124m\"\u001B[39m], [\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmessages\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmodel\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mstream\u001B[39m\u001B[38;5;124m\"\u001B[39m])\n\u001B[1;32m 789\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mcreate\u001B[39m(\n\u001B[1;32m 790\u001B[0m \u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m (...)\u001B[0m\n\u001B[1;32m 826\u001B[0m timeout: \u001B[38;5;28mfloat\u001B[39m \u001B[38;5;241m|\u001B[39m httpx\u001B[38;5;241m.\u001B[39mTimeout \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m|\u001B[39m NotGiven \u001B[38;5;241m=\u001B[39m NOT_GIVEN,\n\u001B[1;32m 827\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m ChatCompletion \u001B[38;5;241m|\u001B[39m Stream[ChatCompletionChunk]:\n\u001B[1;32m 828\u001B[0m validate_response_format(response_format)\n\u001B[0;32m--> 829\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_post\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 830\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m/chat/completions\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[1;32m 831\u001B[0m \u001B[43m \u001B[49m\u001B[43mbody\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmaybe_transform\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 832\u001B[0m \u001B[43m \u001B[49m\u001B[43m{\u001B[49m\n\u001B[1;32m 833\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmessages\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmessages\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 834\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmodel\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmodel\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 835\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43maudio\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43maudio\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 836\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mfrequency_penalty\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mfrequency_penalty\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 837\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mfunction_call\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mfunction_call\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 838\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mfunctions\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mfunctions\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 839\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mlogit_bias\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mlogit_bias\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 840\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mlogprobs\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mlogprobs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 841\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmax_completion_tokens\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmax_completion_tokens\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 842\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmax_tokens\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmax_tokens\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 843\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmetadata\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmetadata\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 844\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmodalities\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmodalities\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 845\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mn\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mn\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 846\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mparallel_tool_calls\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mparallel_tool_calls\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 847\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mprediction\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mprediction\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 848\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mpresence_penalty\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mpresence_penalty\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 849\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mresponse_format\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mresponse_format\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 850\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mseed\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mseed\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 851\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mservice_tier\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mservice_tier\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 852\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstop\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstop\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 853\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstore\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstore\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 854\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstream\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 855\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstream_options\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream_options\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 856\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtemperature\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtemperature\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 857\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtool_choice\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtool_choice\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 858\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtools\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtools\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 859\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtop_logprobs\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtop_logprobs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 860\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtop_p\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtop_p\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 861\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43muser\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43muser\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 862\u001B[0m \u001B[43m \u001B[49m\u001B[43m}\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 863\u001B[0m \u001B[43m \u001B[49m\u001B[43mcompletion_create_params\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mCompletionCreateParams\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 864\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 865\u001B[0m \u001B[43m \u001B[49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmake_request_options\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 866\u001B[0m \u001B[43m \u001B[49m\u001B[43mextra_headers\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_headers\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mextra_query\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_query\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mextra_body\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_body\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\n\u001B[1;32m 867\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 868\u001B[0m \u001B[43m \u001B[49m\u001B[43mcast_to\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mChatCompletion\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 869\u001B[0m \u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[1;32m 870\u001B[0m \u001B[43m \u001B[49m\u001B[43mstream_cls\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mStream\u001B[49m\u001B[43m[\u001B[49m\u001B[43mChatCompletionChunk\u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 871\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/openai/_base_client.py:1278\u001B[0m, in \u001B[0;36mSyncAPIClient.post\u001B[0;34m(self, path, cast_to, body, options, files, stream, stream_cls)\u001B[0m\n\u001B[1;32m 1264\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mpost\u001B[39m(\n\u001B[1;32m 1265\u001B[0m \u001B[38;5;28mself\u001B[39m,\n\u001B[1;32m 1266\u001B[0m path: \u001B[38;5;28mstr\u001B[39m,\n\u001B[0;32m (...)\u001B[0m\n\u001B[1;32m 1273\u001B[0m stream_cls: \u001B[38;5;28mtype\u001B[39m[_StreamT] \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m,\n\u001B[1;32m 1274\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m ResponseT \u001B[38;5;241m|\u001B[39m _StreamT:\n\u001B[1;32m 1275\u001B[0m opts \u001B[38;5;241m=\u001B[39m FinalRequestOptions\u001B[38;5;241m.\u001B[39mconstruct(\n\u001B[1;32m 1276\u001B[0m method\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpost\u001B[39m\u001B[38;5;124m\"\u001B[39m, url\u001B[38;5;241m=\u001B[39mpath, json_data\u001B[38;5;241m=\u001B[39mbody, files\u001B[38;5;241m=\u001B[39mto_httpx_files(files), \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39moptions\n\u001B[1;32m 1277\u001B[0m )\n\u001B[0;32m-> 1278\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m cast(ResponseT, \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcast_to\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mopts\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream_cls\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream_cls\u001B[49m\u001B[43m)\u001B[49m)\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/openai/_base_client.py:955\u001B[0m, in \u001B[0;36mSyncAPIClient.request\u001B[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001B[0m\n\u001B[1;32m 952\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m 953\u001B[0m retries_taken \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m\n\u001B[0;32m--> 955\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_request\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 956\u001B[0m \u001B[43m \u001B[49m\u001B[43mcast_to\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcast_to\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 957\u001B[0m \u001B[43m \u001B[49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43moptions\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 958\u001B[0m \u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 959\u001B[0m \u001B[43m \u001B[49m\u001B[43mstream_cls\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream_cls\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 960\u001B[0m \u001B[43m \u001B[49m\u001B[43mretries_taken\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mretries_taken\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 961\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/openai/_base_client.py:991\u001B[0m, in \u001B[0;36mSyncAPIClient._request\u001B[0;34m(self, cast_to, options, retries_taken, stream, stream_cls)\u001B[0m\n\u001B[1;32m 988\u001B[0m log\u001B[38;5;241m.\u001B[39mdebug(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mSending HTTP Request: \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m\"\u001B[39m, request\u001B[38;5;241m.\u001B[39mmethod, request\u001B[38;5;241m.\u001B[39murl)\n\u001B[1;32m 990\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m--> 991\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_client\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msend\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 992\u001B[0m \u001B[43m \u001B[49m\u001B[43mrequest\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 993\u001B[0m \u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_should_stream_response_body\u001B[49m\u001B[43m(\u001B[49m\u001B[43mrequest\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 994\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 995\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 996\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m httpx\u001B[38;5;241m.\u001B[39mTimeoutException \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[1;32m 997\u001B[0m log\u001B[38;5;241m.\u001B[39mdebug(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mEncountered httpx.TimeoutException\u001B[39m\u001B[38;5;124m\"\u001B[39m, exc_info\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpx/_client.py:926\u001B[0m, in \u001B[0;36mClient.send\u001B[0;34m(self, request, stream, auth, follow_redirects)\u001B[0m\n\u001B[1;32m 922\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_set_timeout(request)\n\u001B[1;32m 924\u001B[0m auth \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_build_request_auth(request, auth)\n\u001B[0;32m--> 926\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_send_handling_auth\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 927\u001B[0m \u001B[43m \u001B[49m\u001B[43mrequest\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 928\u001B[0m \u001B[43m \u001B[49m\u001B[43mauth\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mauth\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 929\u001B[0m \u001B[43m \u001B[49m\u001B[43mfollow_redirects\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mfollow_redirects\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 930\u001B[0m \u001B[43m \u001B[49m\u001B[43mhistory\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m[\u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 931\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 932\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m 933\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m stream:\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpx/_client.py:954\u001B[0m, in \u001B[0;36mClient._send_handling_auth\u001B[0;34m(self, request, auth, follow_redirects, history)\u001B[0m\n\u001B[1;32m 951\u001B[0m request \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mnext\u001B[39m(auth_flow)\n\u001B[1;32m 953\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[0;32m--> 954\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_send_handling_redirects\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 955\u001B[0m \u001B[43m \u001B[49m\u001B[43mrequest\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 956\u001B[0m \u001B[43m \u001B[49m\u001B[43mfollow_redirects\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mfollow_redirects\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 957\u001B[0m \u001B[43m \u001B[49m\u001B[43mhistory\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mhistory\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 958\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 959\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m 960\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpx/_client.py:991\u001B[0m, in \u001B[0;36mClient._send_handling_redirects\u001B[0;34m(self, request, follow_redirects, history)\u001B[0m\n\u001B[1;32m 988\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m hook \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_event_hooks[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrequest\u001B[39m\u001B[38;5;124m\"\u001B[39m]:\n\u001B[1;32m 989\u001B[0m hook(request)\n\u001B[0;32m--> 991\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_send_single_request\u001B[49m\u001B[43m(\u001B[49m\u001B[43mrequest\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 992\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m 993\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m hook \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_event_hooks[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mresponse\u001B[39m\u001B[38;5;124m\"\u001B[39m]:\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpx/_client.py:1027\u001B[0m, in \u001B[0;36mClient._send_single_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 1022\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mRuntimeError\u001B[39;00m(\n\u001B[1;32m 1023\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mAttempted to send an async request with a sync Client instance.\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m 1024\u001B[0m )\n\u001B[1;32m 1026\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m request_context(request\u001B[38;5;241m=\u001B[39mrequest):\n\u001B[0;32m-> 1027\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[43mtransport\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mhandle_request\u001B[49m\u001B[43m(\u001B[49m\u001B[43mrequest\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 1029\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(response\u001B[38;5;241m.\u001B[39mstream, SyncByteStream)\n\u001B[1;32m 1031\u001B[0m response\u001B[38;5;241m.\u001B[39mrequest \u001B[38;5;241m=\u001B[39m request\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpx/_transports/default.py:236\u001B[0m, in \u001B[0;36mHTTPTransport.handle_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 223\u001B[0m req \u001B[38;5;241m=\u001B[39m httpcore\u001B[38;5;241m.\u001B[39mRequest(\n\u001B[1;32m 224\u001B[0m method\u001B[38;5;241m=\u001B[39mrequest\u001B[38;5;241m.\u001B[39mmethod,\n\u001B[1;32m 225\u001B[0m url\u001B[38;5;241m=\u001B[39mhttpcore\u001B[38;5;241m.\u001B[39mURL(\n\u001B[0;32m (...)\u001B[0m\n\u001B[1;32m 233\u001B[0m extensions\u001B[38;5;241m=\u001B[39mrequest\u001B[38;5;241m.\u001B[39mextensions,\n\u001B[1;32m 234\u001B[0m )\n\u001B[1;32m 235\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m map_httpcore_exceptions():\n\u001B[0;32m--> 236\u001B[0m resp \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_pool\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mhandle_request\u001B[49m\u001B[43m(\u001B[49m\u001B[43mreq\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 238\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(resp\u001B[38;5;241m.\u001B[39mstream, typing\u001B[38;5;241m.\u001B[39mIterable)\n\u001B[1;32m 240\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m Response(\n\u001B[1;32m 241\u001B[0m status_code\u001B[38;5;241m=\u001B[39mresp\u001B[38;5;241m.\u001B[39mstatus,\n\u001B[1;32m 242\u001B[0m headers\u001B[38;5;241m=\u001B[39mresp\u001B[38;5;241m.\u001B[39mheaders,\n\u001B[1;32m 243\u001B[0m stream\u001B[38;5;241m=\u001B[39mResponseStream(resp\u001B[38;5;241m.\u001B[39mstream),\n\u001B[1;32m 244\u001B[0m extensions\u001B[38;5;241m=\u001B[39mresp\u001B[38;5;241m.\u001B[39mextensions,\n\u001B[1;32m 245\u001B[0m )\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:216\u001B[0m, in \u001B[0;36mConnectionPool.handle_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 213\u001B[0m closing \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_assign_requests_to_connections()\n\u001B[1;32m 215\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_close_connections(closing)\n\u001B[0;32m--> 216\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m exc \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[1;32m 218\u001B[0m \u001B[38;5;66;03m# Return the response. Note that in this case we still have to manage\u001B[39;00m\n\u001B[1;32m 219\u001B[0m \u001B[38;5;66;03m# the point at which the response is closed.\u001B[39;00m\n\u001B[1;32m 220\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(response\u001B[38;5;241m.\u001B[39mstream, Iterable)\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:196\u001B[0m, in \u001B[0;36mConnectionPool.handle_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 192\u001B[0m connection \u001B[38;5;241m=\u001B[39m pool_request\u001B[38;5;241m.\u001B[39mwait_for_connection(timeout\u001B[38;5;241m=\u001B[39mtimeout)\n\u001B[1;32m 194\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m 195\u001B[0m \u001B[38;5;66;03m# Send the request on the assigned connection.\u001B[39;00m\n\u001B[0;32m--> 196\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[43mconnection\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mhandle_request\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 197\u001B[0m \u001B[43m \u001B[49m\u001B[43mpool_request\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrequest\u001B[49m\n\u001B[1;32m 198\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 199\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m ConnectionNotAvailable:\n\u001B[1;32m 200\u001B[0m \u001B[38;5;66;03m# In some cases a connection may initially be available to\u001B[39;00m\n\u001B[1;32m 201\u001B[0m \u001B[38;5;66;03m# handle a request, but then become unavailable.\u001B[39;00m\n\u001B[1;32m 202\u001B[0m \u001B[38;5;66;03m#\u001B[39;00m\n\u001B[1;32m 203\u001B[0m \u001B[38;5;66;03m# In this case we clear the connection and try again.\u001B[39;00m\n\u001B[1;32m 204\u001B[0m pool_request\u001B[38;5;241m.\u001B[39mclear_connection()\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/connection.py:101\u001B[0m, in \u001B[0;36mHTTPConnection.handle_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 98\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_connect_failed \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n\u001B[1;32m 99\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m exc\n\u001B[0;32m--> 101\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_connection\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mhandle_request\u001B[49m\u001B[43m(\u001B[49m\u001B[43mrequest\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/http11.py:143\u001B[0m, in \u001B[0;36mHTTP11Connection.handle_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 141\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m Trace(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mresponse_closed\u001B[39m\u001B[38;5;124m\"\u001B[39m, logger, request) \u001B[38;5;28;01mas\u001B[39;00m trace:\n\u001B[1;32m 142\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_response_closed()\n\u001B[0;32m--> 143\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m exc\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/http11.py:113\u001B[0m, in \u001B[0;36mHTTP11Connection.handle_request\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 102\u001B[0m \u001B[38;5;28;01mpass\u001B[39;00m\n\u001B[1;32m 104\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m Trace(\n\u001B[1;32m 105\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mreceive_response_headers\u001B[39m\u001B[38;5;124m\"\u001B[39m, logger, request, kwargs\n\u001B[1;32m 106\u001B[0m ) \u001B[38;5;28;01mas\u001B[39;00m trace:\n\u001B[1;32m 107\u001B[0m (\n\u001B[1;32m 108\u001B[0m http_version,\n\u001B[1;32m 109\u001B[0m status,\n\u001B[1;32m 110\u001B[0m reason_phrase,\n\u001B[1;32m 111\u001B[0m headers,\n\u001B[1;32m 112\u001B[0m trailing_data,\n\u001B[0;32m--> 113\u001B[0m ) \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_receive_response_headers\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 114\u001B[0m trace\u001B[38;5;241m.\u001B[39mreturn_value \u001B[38;5;241m=\u001B[39m (\n\u001B[1;32m 115\u001B[0m http_version,\n\u001B[1;32m 116\u001B[0m status,\n\u001B[1;32m 117\u001B[0m reason_phrase,\n\u001B[1;32m 118\u001B[0m headers,\n\u001B[1;32m 119\u001B[0m )\n\u001B[1;32m 121\u001B[0m network_stream \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_network_stream\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/http11.py:186\u001B[0m, in \u001B[0;36mHTTP11Connection._receive_response_headers\u001B[0;34m(self, request)\u001B[0m\n\u001B[1;32m 183\u001B[0m timeout \u001B[38;5;241m=\u001B[39m timeouts\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mread\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mNone\u001B[39;00m)\n\u001B[1;32m 185\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[0;32m--> 186\u001B[0m event \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_receive_event\u001B[49m\u001B[43m(\u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 187\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(event, h11\u001B[38;5;241m.\u001B[39mResponse):\n\u001B[1;32m 188\u001B[0m \u001B[38;5;28;01mbreak\u001B[39;00m\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_sync/http11.py:224\u001B[0m, in \u001B[0;36mHTTP11Connection._receive_event\u001B[0;34m(self, timeout)\u001B[0m\n\u001B[1;32m 221\u001B[0m event \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_h11_state\u001B[38;5;241m.\u001B[39mnext_event()\n\u001B[1;32m 223\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m event \u001B[38;5;129;01mis\u001B[39;00m h11\u001B[38;5;241m.\u001B[39mNEED_DATA:\n\u001B[0;32m--> 224\u001B[0m data \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_network_stream\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mread\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 225\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mREAD_NUM_BYTES\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\n\u001B[1;32m 226\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 228\u001B[0m \u001B[38;5;66;03m# If we feed this case through h11 we'll raise an exception like:\u001B[39;00m\n\u001B[1;32m 229\u001B[0m \u001B[38;5;66;03m#\u001B[39;00m\n\u001B[1;32m 230\u001B[0m \u001B[38;5;66;03m# httpcore.RemoteProtocolError: can't handle event type\u001B[39;00m\n\u001B[0;32m (...)\u001B[0m\n\u001B[1;32m 234\u001B[0m \u001B[38;5;66;03m# perspective. Instead we handle this case distinctly and treat\u001B[39;00m\n\u001B[1;32m 235\u001B[0m \u001B[38;5;66;03m# it as a ConnectError.\u001B[39;00m\n\u001B[1;32m 236\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m data \u001B[38;5;241m==\u001B[39m \u001B[38;5;124mb\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_h11_state\u001B[38;5;241m.\u001B[39mtheir_state \u001B[38;5;241m==\u001B[39m h11\u001B[38;5;241m.\u001B[39mSEND_RESPONSE:\n", + "File \u001B[0;32m~/Documents/GitHub/AutoResearch/sweetbean/.venv/lib/python3.11/site-packages/httpcore/_backends/sync.py:126\u001B[0m, in \u001B[0;36mSyncStream.read\u001B[0;34m(self, max_bytes, timeout)\u001B[0m\n\u001B[1;32m 124\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m map_exceptions(exc_map):\n\u001B[1;32m 125\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sock\u001B[38;5;241m.\u001B[39msettimeout(timeout)\n\u001B[0;32m--> 126\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_sock\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrecv\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmax_bytes\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py:1296\u001B[0m, in \u001B[0;36mSSLSocket.recv\u001B[0;34m(self, buflen, flags)\u001B[0m\n\u001B[1;32m 1292\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m flags \u001B[38;5;241m!=\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[1;32m 1293\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[1;32m 1294\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mnon-zero flags not allowed in calls to recv() on \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;241m%\u001B[39m\n\u001B[1;32m 1295\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m\u001B[38;5;18m__class__\u001B[39m)\n\u001B[0;32m-> 1296\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mread\u001B[49m\u001B[43m(\u001B[49m\u001B[43mbuflen\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 1297\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m 1298\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28msuper\u001B[39m()\u001B[38;5;241m.\u001B[39mrecv(buflen, flags)\n", + "File \u001B[0;32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py:1169\u001B[0m, in \u001B[0;36mSSLSocket.read\u001B[0;34m(self, len, buffer)\u001B[0m\n\u001B[1;32m 1167\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sslobj\u001B[38;5;241m.\u001B[39mread(\u001B[38;5;28mlen\u001B[39m, buffer)\n\u001B[1;32m 1168\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m-> 1169\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_sslobj\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mread\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mlen\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[1;32m 1170\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m SSLError \u001B[38;5;28;01mas\u001B[39;00m x:\n\u001B[1;32m 1171\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m x\u001B[38;5;241m.\u001B[39margs[\u001B[38;5;241m0\u001B[39m] \u001B[38;5;241m==\u001B[39m SSL_ERROR_EOF \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msuppress_ragged_eofs:\n", + "\u001B[0;31mKeyboardInterrupt\u001B[0m: " + ] + } + ], + "execution_count": 16 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:57:57.949545Z", + "start_time": "2024-11-08T12:57:57.717635Z" + } + }, + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "with open('psychometric.json', 'r') as f:\n", + " data = json.load(f)\n", + " \n", + " \n", + "df = pd.DataFrame(data)\n", + "print(df['coherence'].unique())\n", + "# remove all rows where coherenc is above 1 or below 0\n", + "df = df[df['coherence'] <= 1]\n", + "df = df[df['model'] != 'llama3-8']\n", + "\n", + "# use get_accuracy to get the accuracy in each row \n", + "df['accuracy_new'] = df.apply(lambda x: get_accuracy(x['response'], x['direction']), axis=1)\n", + "df.to_csv('psychometric.csv')\n", + "\n", + "df = df[df['num_of_dots'] == 100]\n", + "\n", + "\n", + "# plot the data mean coherence vs mean accuracy with model as hue\n", + "plt.figure(figsize=(10, 6))\n", + "\n", + "\n", + "for m in df['model'].unique():\n", + " plt.plot(df[df['model'] == m].groupby('coherence')['coherence'].mean(), df[df['model'] == m].groupby('coherence')['accuracy_new'].mean(), 'o')\n", + "plt.errorbar(df.groupby('coherence')['coherence'].mean(), df.groupby('coherence')['accuracy_new'].mean())\n", + "\n", + "\n", + "# plot the full average\n", + "plt.xlabel('Coherence')\n", + "plt.ylabel('Accuracy')\n", + "plt.title('Accuracy vs Coherence')\n", + "plt.legend(df['model'].unique())\n", + "plt.show()\n", + "\n", + "\n", + "\n", + "# plot the data points\n", + "\n", + "# plt.plot(df.groupby('coherence')['accuracy'].mean())\n", + "\n", + "plt.show()\n" + ], + "id": "cc650801c42bfad7", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.65 0.7 0.8\n", + " 0.9 1. 0.62 0.63 0.64 0.66 0.67 0.68 0.69 0.61 0.75 0.72 0.74 0.76]\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADD3ElEQVR4nOzdeXiTVfo38O+TpE2btGkLpEkppS2lLLUItNDKJiIFKojLqOCK4sYwOgPTWQRmlGHmFdRxEMefCzqiqCi4oOIyFQEZQZAKBaGylQIFupcu6Zo2yfP+kSY0Tdomadp0+X6uq5fk5JznuZNCzd1zzn0EURRFEBERERERUask3g6AiIiIiIiou2PiRERERERE1A4mTkRERERERO1g4kRERERERNQOJk5ERERERETtYOJERERERETUDiZORERERERE7WDiRERERERE1A4mTkRERERERO1g4kREROQFUVFRuPHGG70dBhEROYmJExFRN/HKK69AEAQkJyd7OxRyICcnB4sWLcKQIUPg5+cHlUqFSZMm4cUXX0RdXZ23wyMiok4m83YARERktmnTJkRFRSEjIwNnzpzB0KFDvR0SNfnqq69wxx13QC6XY8GCBYiPj0dDQwP27t2LP/3pT/jll1/w+uuveztMIiLqREyciIi6gXPnzmHfvn3YunUrFi1ahE2bNmHlypXeDsuhmpoaKJVKb4fRZc6dO4c777wTkZGR2LVrF8LCwqzPPfbYYzhz5gy++uorL0bYOoPBAJPJBF9fX2+HQkTU43GpHhFRN7Bp0yaEhIRgzpw5uP3227Fp0yaH/SoqKvD73/8eUVFRkMvlGDRoEBYsWIDS0lJrn/r6evztb3/DsGHD4Ofnh7CwMPzqV79CTk4OAGD37t0QBAG7d++2ufb58+chCALefvtta9sDDzyAgIAA5OTkYPbs2QgMDMQ999wDANizZw/uuOMODB48GHK5HBEREfj973/vcNnayZMnMW/ePKjVavj7+2P48OH4y1/+AgD47rvvIAgCPv30U7tx77//PgRBwP79+x2+HwcPHoQgCNi4caPdc9988w0EQcCXX34JAKiqqsLSpUut711oaChmzJiBzMxMh9e2eO6551BdXY0333zTJmmyGDp0KJYsWWJ9bDAY8I9//AMxMTGQy+WIiorCihUroNfrHV5/7969SEpKgp+fH4YMGYJ33nnHrk9FRQWWLl2KiIgIyOVyDB06FM8++yxMJpO1j+X79/zzz2PdunXW+x8/fhyA+Xtw++23o1+/fvDz88O4ceOwbds2m/u8/fbbEAQBP/zwA9LS0qBWq6FUKnHrrbeipKTELq7//ve/mDp1KgIDA6FSqTB+/Hi8//77Nn0OHDiA1NRUBAUFQaFQYOrUqfjhhx/aeMeJiLonzjgREXUDmzZtwq9+9Sv4+vrirrvuwquvvoqffvoJ48ePt/aprq7GlClTcOLECTz44INISEhAaWkptm3bhkuXLmHAgAEwGo248cYbsXPnTtx5551YsmQJqqqq8O233yIrKwsxMTEux2YwGDBr1ixMnjwZzz//PBQKBQDgo48+Qm1tLRYvXoz+/fsjIyMDL730Ei5duoSPPvrIOv7o0aOYMmUKfHx88OijjyIqKgo5OTn44osv8PTTT+O6665DREQENm3ahFtvvdXufYmJicGECRMcxjZu3DgMGTIEH374Ie6//36b57Zs2YKQkBDMmjULAPDrX/8aH3/8MR5//HHExcXh8uXL2Lt3L06cOIGEhIRWX/8XX3yBIUOGYOLEiU69Xw8//DA2btyI22+/HX/4wx9w4MABrFmzBidOnLBLDs+cOYPbb78dDz30EO6//35s2LABDzzwABITE3HVVVcBAGprazF16lTk5eVh0aJFGDx4MPbt24fly5ejoKAA69ats7nmW2+9hfr6ejz66KOQy+Xo168ffvnlF0yaNAnh4eFYtmwZlEolPvzwQ9xyyy345JNP7N733/72twgJCcHKlStx/vx5rFu3Do8//ji2bNli7fP222/jwQcfxFVXXYXly5cjODgYhw8fRnp6Ou6++24AwK5du3DDDTcgMTERK1euhEQiwVtvvYXrr78ee/bsQVJSklPvKRFRtyASEZFXHTx4UAQgfvvtt6IoiqLJZBIHDRokLlmyxKbfU089JQIQt27dancNk8kkiqIobtiwQQQgrl27ttU+3333nQhA/O6772yeP3funAhAfOutt6xt999/vwhAXLZsmd31amtr7drWrFkjCoIg5ubmWtuuvfZaMTAw0KateTyiKIrLly8X5XK5WFFRYW0rLi4WZTKZuHLlSrv7NLd8+XLRx8dHLCsrs7bp9XoxODhYfPDBB61tQUFB4mOPPdbmtVqqrKwUAYg333yzU/2P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hIQEPProo4iOjsb58+fx1Vdf4ciRIzZ9FyxYgNtvvx0A8I9//MP5NxPmWaennnoKfn5+eOihh2yWF1ZVVWHQoEG4/fbbMXr0aAQEBGDHjh346aef8K9//avN68bExOD999/H/PnzMXLkSCxYsADx8fFoaGjAvn378NFHH+GBBx4AYN5vdf/99+P1119HRUUFpk6dioyMDGzcuBG33HKLtQCIK/70pz9h27ZtuPHGG62lymtqanDs2DF8/PHHOH/+fLsJ5ssvv4zJkydj1KhReOSRRzBkyBAUFRVh//79uHTpEn7++WeXYlKpVHjhhRfw8MMPY/z48bj77rsREhKCn3/+GbW1tdi4cSMkEgn+85//4IYbbsBVV12FhQsXIjw8HHl5efjuu++gUqnwxRdfuPx+EBF5jbfK+RER9XVz584V/fz8xJqamlb7PPDAA6KPj49YWloqiqIoXr58WXz88cfF8PBw0dfXVxw0aJB4//33W58XRXO557/85S9idHS06OPjI2q1WvH2228Xc3JyrH1KSkrE2267TVQoFGJISIi4aNEiMSsry2E5cqVS6TC248ePiykpKWJAQIA4YMAA8ZFHHhF//vlnu2uIoihmZWWJt956qxgcHCz6+fmJw4cPF5988km7a+r1ejEkJEQMCgqyK3PdnuzsbBGACEDcu3ev3XX/9Kc/iaNHjxYDAwNFpVIpjh49WnzllVecvv7p06fFRx55RIyKihJ9fX3FwMBAcdKkSeJLL71kU+a7sbFRXLVqlfX9j4iIEJcvX27TRxTN5cjnzJljd5+pU6eKU6dOtWmrqqoSly9fLg4dOlT09fUVBwwYIE6cOFF8/vnnxYaGBlEUr5Qj/+c//+kw/pycHHHBggWiVqsVfXx8xPDwcPHGG28UP/74Y2sfSznyn376yWZsayXst23bJk6cOFH09/cXVSqVmJSUJH7wwQc2fQ4fPiz+6le/Evv37y/K5XIxMjJSnDdvnrhz507HbzQRUTcliKILOz2JiIg6kcFgwMCBAzF37ly8+eab3g6HiIjIinuciIio2/jss89QUlJiU3CCiIioO+CMExERed2BAwdw9OhR/OMf/8CAAQOQmZnp7ZCIiIhscMaJiIi87tVXX8XixYsRGhqKd955x9vhEBER2eGMExERERERUTs440RERERERNQOJk5ERERERETt6HMH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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 22 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:52:00.119784Z", + "start_time": "2024-11-08T12:51:59.867635Z" + } + }, + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "with open('psychometric_bu.json', 'r') as f:\n", + " data = json.load(f)\n", + "\n", + "models_excluded = ['llama3-8b', 'llama2-7b']\n", + " \n", + "df = pd.DataFrame(data)\n", + "\n", + "# remove all rows where coherenc is above 1 or below 0\n", + "df = df[df['coherence'] <= 1]\n", + "df.to_csv('psychometric.csv')\n", + "for m in models_excluded:\n", + " df = df[df['model'] != m]\n", + "df = df[df['model'] == 'llama3.1-70b']\n", + "\n", + "\n", + "# use get_accuracy to get the accuracy in each row \n", + "df['accuracy_new'] = df.apply(lambda x: get_accuracy(x['response'], x['direction']), axis=1)\n", + "\n", + "\n", + "# plot the data mean coherence vs mean accuracy with model as hue\n", + "plt.figure(figsize=(10, 6))\n", + "# plot average for each model smooth the curve\n", + "# for m in df['model'].unique():\n", + "# model_data = df[df['model'] == m].groupby('coherence').mean().rolling(window=3).mean()\n", + "# plt.plot(model_data['coherence'], model_data['accuracy'])\n", + "\n", + "\n", + "for n_d in df['num_of_dots'].unique():\n", + " plt.errorbar(df[df['num_of_dots'] == n_d].groupby('coherence')['coherence'].mean(), df[df['num_of_dots'] == n_d].groupby('coherence')['accuracy_new'].mean())\n", + "\n", + "\n", + "# for m in df['model'].unique():\n", + "# coherence_counts = df[df['model'] == m].groupby('coherence').size()\n", + "# \n", + "# # Normalize the counts to get alpha values (between 0.1 and 1)\n", + "# min_count = coherence_counts.min()\n", + "# max_count = coherence_counts.max()\n", + "# normalized_counts = (coherence_counts - min_count) / (max_count - min_count)\n", + "# alphas = 0.1 + 0.9 * normalized_counts\n", + "# \n", + "# # Plot the data with varying alpha values\n", + "# for coherence, alpha in alphas.items():\n", + "# subset = df[(df['model'] == m) & (df['coherence'] == coherence)]\n", + "# plt.plot(subset['coherence'].mean(), subset['accuracy'].mean(), 'o', alpha=alpha)\n", + "\n", + "# plot the full average\n", + "plt.xlabel('Coherence')\n", + "plt.ylabel('Accuracy')\n", + "plt.title('Accuracy vs Coherence')\n", + "plt.legend(df['num_of_dots'].unique())\n", + "plt.show()\n", + "\n", + "\n", + "\n", + "# plot the data points\n", + "\n", + "# plt.plot(df.groupby('coherence')['accuracy'].mean())\n", + "\n", + "plt.show()\n" + ], + "id": "b662dd01de12cdfe", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACI6ElEQVR4nO3deXhU5d3/8c/MZJbsIWQhILK5gQsoKuJei6UuVK0LVFsoKrYWrEpbK25UbaW1LlSLUltR22LlUdGfVYtSLKVWhArighuLggLZCCH7JDNzfn9MziRD1pnMzJkk79d1cZGcOcs9YeqTz/O97+9tMwzDEAAAAACgQ3arBwAAAAAAyY7gBAAAAABdIDgBAAAAQBcITgAAAADQBYITAAAAAHSB4AQAAAAAXSA4AQAAAEAXCE4AAAAA0AWCEwAAAAB0geAEAIAFhg8frvPPP9/qYQAAuongBABJ4pFHHpHNZtOECROsHgrasW3bNv3gBz/QyJEj5fF4lJWVpVNOOUW/+93vVF9fb/XwAABxlmL1AAAAQUuXLtXw4cO1fv16bd26VYcccojVQ0KzV155RZdeeqncbremT5+uo446So2NjXrzzTf1s5/9TJs3b9Zjjz1m9TABAHFEcAKAJPD555/rrbfe0vLly/WDH/xAS5cu1fz5860eVrtqa2uVnp5u9TAS5vPPP9e0adM0bNgwvfHGGyoqKgq9Nnv2bG3dulWvvPKKhSPsmM/nUyAQkMvlsnooANDrMVUPAJLA0qVLNWDAAJ133nm65JJLtHTp0nbPq6ys1I033qjhw4fL7XbroIMO0vTp01VeXh46p6GhQb/4xS902GGHyePxqKioSN/+9re1bds2SdLq1atls9m0evXqsHt/8cUXstlsevLJJ0PHvv/97ysjI0Pbtm3Tueeeq8zMTF1xxRWSpP/85z+69NJLdfDBB8vtdmvo0KG68cYb25229sknn+iyyy5Tfn6+UlNTdfjhh+vWW2+VJP3rX/+SzWbTCy+80Oa6p59+WjabTWvXrm335/HOO+/IZrPpqaeeavPaa6+9JpvNppdfflmSVF1drRtuuCH0sysoKNDZZ5+tjRs3tntv07333quamho9/vjjYaHJdMghh+j6668Pfe/z+XT33Xdr1KhRcrvdGj58uG655RZ5vd527//mm2/qxBNPlMfj0ciRI/XnP/+5zTmVlZW64YYbNHToULndbh1yyCH6zW9+o0AgEDrH/Pe77777tHDhwtDzP/roI0nBf4NLLrlEubm58ng8Ov744/XSSy+FPefJJ5+UzWbTf//7X82dO1f5+flKT0/XRRddpLKysjbj+sc//qEzzjhDmZmZysrK0gknnKCnn3467Jx169bpm9/8prKzs5WWlqYzzjhD//3vfzv5iQNAcqLiBABJYOnSpfr2t78tl8ul73znO3r00Uf1v//9TyeccELonJqaGp122mn6+OOPdeWVV+q4445TeXm5XnrpJX311VfKy8uT3+/X+eefr1WrVmnatGm6/vrrVV1drZUrV+rDDz/UqFGjIh6bz+fT5MmTdeqpp+q+++5TWlqaJOnZZ59VXV2drr32Wg0cOFDr16/Xww8/rK+++krPPvts6Pr3339fp512mpxOp6655hoNHz5c27Zt09///nf96le/0plnnqmhQ4dq6dKluuiii9r8XEaNGqWJEye2O7bjjz9eI0eO1P/93/9pxowZYa8tW7ZMAwYM0OTJkyVJP/zhD/Xcc89pzpw5GjNmjPbu3as333xTH3/8sY477rgO3//f//53jRw5UieffHK3fl5XX321nnrqKV1yySX6yU9+onXr1mnBggX6+OOP24TDrVu36pJLLtFVV12lGTNmaMmSJfr+97+v8ePH68gjj5Qk1dXV6YwzztCuXbv0gx/8QAcffLDeeustzZs3T3v27NHChQvD7vnEE0+ooaFB11xzjdxut3Jzc7V582adcsopGjJkiG6++Walp6fr//7v/3ThhRfq+eefb/Nzv+666zRgwADNnz9fX3zxhRYuXKg5c+Zo2bJloXOefPJJXXnllTryyCM1b9485eTk6N1339WKFSt0+eWXS5LeeOMNnXPOORo/frzmz58vu92uJ554QmeddZb+85//6MQTT+zWzxQAkoIBALDUO++8Y0gyVq5caRiGYQQCAeOggw4yrr/++rDz7rjjDkOSsXz58jb3CAQChmEYxpIlSwxJxgMPPNDhOf/6178MSca//vWvsNc///xzQ5LxxBNPhI7NmDHDkGTcfPPNbe5XV1fX5tiCBQsMm81m7NixI3Ts9NNPNzIzM8OOtR6PYRjGvHnzDLfbbVRWVoaOlZaWGikpKcb8+fPbPKe1efPmGU6n06ioqAgd83q9Rk5OjnHllVeG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VFtbq3/+85/60Y9+pAsuuEDZ2dm69NJL9fDDD8tms2nUqFF6+eWX26xz6cwRRxyhUaNG6ac//al27dqlrKwsPf/882Frc0wPPfSQTj31VB133HG65pprNGLECH3xxRd65ZVXtGnTprBzp0+frksuuUSSdPfdd3f/h6lg1emOO+6Qx+PRVVddFTa9sLq6WgcddJAuueQSjR07VhkZGfrnP/+p//3vf7r//vs7ve+oUaP09NNPa+rUqRo9erSmT5+uo446So2NjXrrrbf07LPP6vvf/76k4HqrGTNm6LHHHlNlZaXOOOMMrV+/Xk899ZQuvPDCUAOQSPzsZz/TSy+9pPPPPz/Uqry2tlYffPCBnnvuOX3xxRddBsxFixbp1FNP1dFHH61Zs2Zp5MiRKikp0dq1a/XVV1/pvffei2hMWVlZevDBB3X11VfrhBNO0OWXX64BAwbovffeU11dnZ566inZ7Xb96U9/0jnnnKMjjzxSM2fO1JAhQ7Rr1y7961//UlZWlv7+979H/PMAAMtY1c4PAPq7KVOmGB6Px6itre3wnO9///uG0+k0ysvLDcMwjL179xpz5swxhgwZYrhcLuOggw4yZsyYEXrdMILtnm+99VZjxIgRhtPpNAYNGmRccsklxrZt20LnlJWVGRdffLGRlpZmDBgwwPjBD35gfPjhh+22I09PT293bB999JExadIkIyMjw8jLyzNmzZplvPfee23uYRiG8eGHHxoXXXSRkZOTY3g8HuPwww83br/99jb39Hq9xoABA4zs7Ow2ba67smXLFkOSIcl4880329z3Zz/7mTF27FgjMzPTSE9PN8aOHWs88sgj3b7/Z599ZsyaNcsYPny44XK5jMzMTOOUU04xHn744bA2301NTcadd94Z+vkPHTrUmDdvXtg5hhFsR37eeee1ec4ZZ5xhnHHGGWHHqqurjXnz5hmHHHKI4XK5jLy8POPkk0827rvvPqOxsdEwjJZ25L/97W/bHf+2bduM6dOnG4MGDTKcTqcxZMgQ4/zzzzeee+650DlmO/L//e9/Ydd21ML+pZdeMk4++WQjNTXVyMrKMk488UTjb3/7W9g57777rvHtb3/bGDhwoOF2u41hw4YZl112mbFq1ar2f9AAkKRshhHBSk8AAOLI5/Np8ODBmjJlih5//HGrhwMAQAhrnAAASePFF19UWVlZ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LpfGjx+vVatWhY4FAgGtWrVKEydObHP+EUccoQ8++ECbNm0K/fnWt76lr33ta9q0aRPT7wAAAADEheVT9ebOnasZM2bo+OOP14knnqiFCxeqtrZWM2fOlCRNnz5dQ4YM0YIFC+TxeHTUUUeFXW9Wjw48DgAAAACxYnlwmjp1qsrKynTHHXeouLhY48aN04oVK0INI3bu3Cm73fKu6XHjdrs1f/78NtMJgfbweUGk+MwgUnxmECk+M4hUb/3M2Izu9N4DAAAAgH6s75ZyAAAAACBGCE4AAAAA0AWCEwAAAAB0geAEAAAAAF0gOMXZokWLNHz4cHk8Hk2YMEHr16/v8Nwnn3xSNpst7I/H40ngaJEMIvnMSFJlZaVmz56toqIiud1uHXbYYXr11VcTNFokg0g+M2eeeWab/87YbDadd955CRwxrBbpf2cWLlyoww8/XKmpqRo6dKhuvPFGNTQ0JGi0SAaRfGaampp01113adSoUfJ4PBo7dqxWrFiRwNHCamvWrNGUKVM0ePBg2Ww2vfjii11es3r1ah133HFyu9065JBD9OSTT8Z9nBEzEDfPPPOM4XK5jCVLlhibN282Zs2aZeTk5BglJSXtnv/EE08YWVlZxp49e0J/iouLEzxqWCnSz4zX6zWOP/5449xzzzXefPNN4/PPPzdWr15tbNq0KcEjh1Ui/czs3bs37L8xH374oeFwOIwnnngisQOHZSL9zCxdutRwu93G0qVLjc8//9x47bXXjKKiIuPGG29M8MhhlUg/MzfddJMxePBg45VXXjG2bdtmPPLII4bH4zE2btyY4JHDKq+++qpx6623GsuXLzckGS+88EKn52/fvt1IS0sz5s6da3z00UfGww8/bDgcDmPFihWJGXA3EZzi6MQTTzRmz54d+t7v9xuDBw82FixY0O75TzzxhJGdnZ2g0SEZRfqZefTRR42RI0cajY2NiRoikkykn5kDPfjgg0ZmZqZRU1MTryEiyUT6mZk9e7Zx1llnhR2bO3euccopp8R1nEgekX5mioqKjN///vdhx7797W8bV1xxRVzHieTUneB00003GUceeWTYsalTpxqTJ0+O48gix1S9OGlsbNSGDRs0adKk0DG73a5JkyZp7dq1HV5XU1OjYcOGaejQobrgggu0efPmRAwXSSCaz8xLL72kiRMnavbs2SosLNRRRx2le+65R36/P1HDhoWi/e9Ma48//rimTZum9PT0eA0TSSSaz8zJJ5+sDRs2hKZmbd++Xa+++qrOPffchIwZ1ormM+P1etssNUhNTdWbb74Z17Gi91q7dm3YZ0ySJk+e3O3/W5YoBKc4KS8vl9/vV2FhYdjxwsJCFRcXt3vN4YcfriVLluj//b//p7/+9a8KBAI6+eST9dVXXyViyLBYNJ+Z7du367nnnpPf79err76q22+/Xffff79++ctfJmLIsFg0n5nW1q9frw8//FBXX311vIaIJBPNZ+byyy/XXXfdpVNPPVVOp1OjRo3SmWeeqVtuuSURQ4bFovnMTJ48WQ888IC2bNmiQCCglStXavny5dqzZ08ihoxeqLi4uN3PWFVVlerr6y0aVVsEpyQyceJETZ8+XePGjdMZZ5yh5cuXKz8/X3/4wx+sHhqSVCAQUEFBgR577DGNHz9eU6dO1a233qrFixdbPTT0Ao8//riOPvponXjiiVYPBUls9erVuueee/TII49o48aNWr58uV555RXdfffdVg8NSep3v/udDj30UB1xxBFyuVyaM2eOZs6cKbudXzvRu6VYPYC+Ki8vTw6HQyUlJWHHS0pKNGjQoG7dw+l06thjj9XWrVvjMUQkmWg+M0VFRXI6nXI4HKFjo0ePVnFxsRobG+VyueI6ZlirJ/+dqa2t1TPPPKO77rornkNEkonmM3P77bfre9/7XqgyefTRR6u2tlbXXHONbr31Vn4Z7uOi+czk5+frxRdfVENDg/bu3avBgwfr5ptv1siRIxMxZPRCgwYNavczlpWVpdTUVItG1Rb/tYsTl8ul8ePHa9WqVaFjgUBAq1at0sSJE7t1D7/frw8++EBFRUXxGiaSSDSfmVNOOUVbt25VIBAIHfvss89UVFREaOoHevLfmWeffVZer1ff/e534z1MJJFoPjN1dXVtwpH5/6wxDCN+g0VS6Ml/Zzwej4YMGSKfz6fnn39eF1xwQbyHi15q4sSJYZ8xSVq5cmW3f2dOGKu7U/RlzzzzjOF2u40nn3zS+Oijj4xrrrnGyMnJCbUY/973vmfcfPPNofPvvPNO47XXXjO2bdtmbNiwwZg2bZrh8XiMzZs3W/UWkGCRfmZ27txpZGZmGnPmzDE+/fRT4+WXXzYKCgqMX/7yl1a9BSRYpJ8Z06mnnmpMnTo10cNFEoj0MzN//nwjMzPT+Nvf/mZs377deP31141Ro0YZl112mVVvAQkW6Wfm7bffNp5//nlj27Ztxpo1a4yzzjrLGDFihLFv3z6L3gESrbq62nj33XeNd99915BkPPDAA8a7775r7NixwzAMw7j55puN733ve6HzzXbkP/vZz4yPP/7YWLRoEe3I+6OHH37YOPjggw2Xy2WceOKJxttvvx167YwzzjBmzJgR+v6GG24InVtYWGice+657HnQD0XymTEMw3jrrbeMCRMmGG632xg5cqTxq1/9yvD5fAkeNawU6Wfmk08+MSQZr7/+eoJHimQRyWemqanJ+MUvfmGMGjXK8Hg8xtChQ40f/ehH/BLcz0TymVm9erUxevRow+12GwMHDjS+973vGbt27bJg1LDKv/71L0NSmz/m52TGjBnGGWec0eaacePGGS6Xyxg5cmRS7i9oMwzq7AAAAADQGdY4AQAAAEAXCE4AAAAA0AWCEwAAAAB0geAEAAAAAF0gOAEAAABAFwhOAAAAANAFghMAAAAAdIHgBAAAAABdIDgBAHqVX/ziFxo3bpzVwwAA9DMEJwBAQhUXF+u6667TyJEj5Xa7NXToUE2ZMkWrVq2yemgAAHQoxeoBAAD6jy+++EKnnHKKcnJy9Nvf/lZHH320mpqa9Nprr2n27Nn65JNPLBmXYRjy+/1KSeH/LAIA2kfFCQCQMD/60Y9ks9m0fv16XXzxxTrssMN05JFHau7cuXr77bclSTt37tQFF1ygjIwMZWVl6bLLLlNJSUmbe/3lL3/R8OHDlZ2drWnTpqm6ujr0WiAQ0IIFCzRixAilpqZq7Nixeu6550Kvr169WjabTf/4xz80fvx4ud1uvfnmm92+btWqVTr++OOVlpamk08+WZ9++mnY2P7+97/rhBNOkMfjUV5eni666KLQa16vVz/96U81ZMgQpaena8KECVq9enWsfsQAgDghOAEAEqKiokIrVqzQ7NmzlZ6e3ub1nJwcBQIBXXDBBaqoqNC///1vrVy5Utu3b9fUqVPDzt22bZtefPFFvfzyy3r55Zf173//W7/+9a9Dry9YsEB//vOftXjxYm3evFk33nijvvvd7+rf//532H1uvvlm/frXv9bHH3+sY445ptvX3Xrrrbr//vv1zjvvKCUlRVdeeWXotVdeeUUXXXSRzj33XL377rtatWqVTjzxxNDrc+bM0dq1a/XMM8/o/fff16WXXqpvfvOb2rJlS49+vgCAODMAAEiAdevWGZKM5cuXd3jO66+/bjgcDmPnzp2hY5s3bzYkGevXrzcMwzDmz59vpKWlGVVVVaFzfvaznxkTJkwwDMMwGhoajLS0NOOtt94Ku/dVV11lfOc73zEMwzD+9a9/GZKMF198MfR6JNf985//DL3+yiuvGJKM+vp6wzAMY+LEicYVV1zR7vvbsWOH4XA4jF27doUd//rXv27Mmzevw58LAMB6TOYGACSEYRhdnvPxxx9r6NChGjp0aOjYmDFjlJOTo48//lgnnHCCJGn48OHKzMwMnVNUVKTS0lJJ0tatW1VXV6ezzz477N6NjY069thjw44df/zxoa8jue6YY44Je7YklZaW6uCDD9amTZs0a9asdt/fBx98IL/fr8MOOyzsuNfr1cCBA9u9BgCQHAhOAICEOPTQQ2Wz2WLSAMLpdIZ9b7PZFAgEJEk1NTWSglPmhgwZEnae2+0O+771lMFIrmv9fJvNJkmh56empnY47pqaGjkcDm3YsEEOhyPstYyMjA6vAwBYj+AEAEiI3NxcTZ48WYsWLdKPf/zjNuucKisrNXr0aH355Zf68ssvQ1Wnjz76SJWVlRozZky3njNmzBi53W7t3LlTZ5xxRrfHF+11BzrmmGO0atUqzZw5s81rxx57rPx+v0pLS3XaaadF/QwAQOIRnAAACbNo0SKdcsopOvHEE3XXXXfpmGOOkc/n08qVK/Xoo4/qo48+0tFHH60rrrhCCxculM/n049+9COdccYZYdPqOpOZmamf/vSnuvHGGxUIBHTqqadq//79+u9//6usrCzNmDEjptcdaP78+fr617+uUaNGadq0afL5fHr11Vf185//XIcddpiuuOIKTZ8+Xffff7+OPfZYlZWVadWqVTrmmGN03nnndftnCQBILIITACBhRo4cqY0bN+pXv/qVfvKTn2jPnj3Kz8/X+PHj9eijj8pms+n//b//p+uuu06nn3667Ha7vvnNb+rhhx+O6Dl333238vPztWDBAm3fvl05OTk67rjjdMstt8TlutbOPPNMPfvss7r77rv161//WllZWTr99NNDrz/xxBP65S9/qZ/85CfatWuX8vLydNJJJ+n888+P6D0CABLLZnRntS4AAAAA9GPs4wQAAAAAXSA4AQAAAEAXCE4AAAAA0AWCEwAAAAB0geAEAAAAAF0gOAEAAABAFwhOAAAAANAFghMAAAAAdIHgBAAAAABdIDgBAAAAQBcITgAAAADQhf8PIDmtGkI1Uq8AAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 39 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T12:57:49.147128Z", + "start_time": "2024-11-08T12:57:49.015011Z" + } + }, + "cell_type": "code", + "source": [ + "df = pd.read_csv('psychometric_2.csv')\n", + "df = df.drop(columns='Unnamed: 0')\n", + "dct = df.to_dict(orient='list')\n", + "with open('psychometric.json', 'w') as f:\n", + " json.dump(dct, f)" + ], + "id": "83152cff338dcd73", + "outputs": [], + "execution_count": 20 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "733b945aa0948fbb" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/AI Experiment/Stability Flexibility.ipynb b/examples/AI Experiment/Stability Flexibility.ipynb new file mode 100644 index 0000000..ad530ab --- /dev/null +++ b/examples/AI Experiment/Stability Flexibility.ipynb @@ -0,0 +1,466 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-11-08T23:32:27.681072Z", + "start_time": "2024-11-08T23:32:27.673478Z" + } + }, + "source": [ + "from google_api import generate\n", + "from llama_api import generate_llama" + ], + "outputs": [], + "execution_count": 38 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T23:32:27.970879Z", + "start_time": "2024-11-08T23:32:27.966695Z" + } + }, + "cell_type": "code", + "source": [ + "import random\n", + "\n", + "conditions = {\n", + " \"high_time_pressure_condition\": ' This is a time critical task. Respond after seen at least dots as possible.',\n", + " \"both_condition\": ' Please respond after seen at least dots as possible but also make sure that you are as accurate as possible.',\n", + " \"high_accuracy_pressure_condition\": \" It is very important to be as accurate as possible. Don't rush your decision.\",\n", + " \"low_reward_condition\": ' This task is not rewarded.',\n", + " \"medium_reward_condition\": ' This task is rewarded with $0.1 for each correct response.',\n", + " \"high_reward_condition\": ' This task is rewarded with $1 for each correct response.'\n", + "}\n", + "\n", + "\n", + "def create_prompt(coherence,\n", + " number_of_dots,\n", + " direction,\n", + " preamble=None,\n", + " appendix=None,\n", + " condition='',\n", + " total_num_of_dots=1000):\n", + " prompt = ''\n", + " if preamble is None:\n", + " preamble = f'In this task you see dots moving. Please indicate the main direction of the dots. In total there are {total_num_of_dots} dots. Some of them might move left and other might move right but you can only look at one point at a time. You can decide to either look at more dots then respond with \"continue\". But you can also decide that you looked at enough dots. Then respond with \"left\" or \"right\".{condition} Remember: Your decision is to either look at more dots (continue) or to decide on the main direction of the dots (left or right).'\n", + " if appendix is None:\n", + " appendix = 'Please indicate if you want to look at more dots (continue), then you will see another dot and can decide again. If you decide that you looked at enough dots, decide on the main directory of th dots. The only acceptable responses are \"left\", \"right\" or \"continue\". Make sure to not respond with anything else then \"left\", \"right\" or \"continue\".'\n", + " prompt += preamble\n", + " if abs(coherence * number_of_dots - round(coherence * number_of_dots)) > 0.004:\n", + " raise ValueError('coherence * number_of_dots must be an integer')\n", + " if direction == 'right':\n", + " trials = ['This dot is moving right.'] * int(number_of_dots * coherence)\n", + " trials += ['This dot is moving left.'] * int(number_of_dots * (1 - coherence))\n", + " else:\n", + " trials = ['This dot is moving left.'] * int(number_of_dots * coherence)\n", + " trials += ['This dot is moving right.'] * int(number_of_dots * (1 - coherence))\n", + " random.shuffle(trials)\n", + " for trial in trials:\n", + " prompt += ' ' + trial\n", + " prompt += ' ' + appendix\n", + " return prompt" + ], + "id": "a3b214e7af3f110e", + "outputs": [], + "execution_count": 39 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T23:32:28.816342Z", + "start_time": "2024-11-08T23:32:28.814074Z" + } + }, + "cell_type": "code", + "source": [ + "def get_accuracy(response, direction):\n", + " if response.lower() in 'continue' or 'continue' in response.lower():\n", + " return 'continue'\n", + " return response.lower() in direction or direction in response.lower()\n", + "coherences = [.5, .6, .7, .8, .9, 1.]\n", + "times = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]\n", + "directions = ['left', 'right']" + ], + "id": "65bb8a0b10e9ca4d", + "outputs": [], + "execution_count": 40 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T23:32:29.363599Z", + "start_time": "2024-11-08T23:32:29.360182Z" + } + }, + "cell_type": "code", + "source": [ + "import json\n", + "data = {}\n", + "data['coherence'] = []\n", + "data['direction'] = []\n", + "data['num_of_dots'] = []\n", + "data['prompt'] = []\n", + "data['response'] = []\n", + "data['accuracy'] = []\n", + "data['model'] = []\n", + "data['condition'] = []\n", + "data['total_num_of_dots'] = 1000\n", + "with open('stabFlex.json', 'w') as f:\n", + " json.dump(data, f)" + ], + "id": "c0fed0d008a72e97", + "outputs": [], + "execution_count": 41 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-09T11:48:40.742778Z", + "start_time": "2024-11-09T11:31:42.198285Z" + } + }, + "cell_type": "code", + "source": [ + "import time\n", + "\n", + "with open('stabFlex.json', 'r') as f:\n", + " data = json.load(f)\n", + " \n", + "is_sleep = False\n", + "# model = 'llama3.1-70b'\n", + "# model = 'mixtral-8x22b'\n", + "# model = 'llama2-7b'\n", + "models = ['llama3.1-70b', 'gemini-1.5-flash-002', 'gemini-1.0-pro-001']\n", + "models = ['llama3.1-70b', 'gemini-1.5-flash-002', 'gemini-1.0-pro-001']\n", + "models = ['llama3.1-70b']\n", + "\n", + "total_num = 1000\n", + "# model = 'llama3-8b'\n", + "i = 0\n", + "for c in conditions:\n", + " for timestep in times:\n", + " for direction in directions: \n", + " for coherence in coherences:\n", + " prompt= create_prompt(coherence, timestep, direction, condition=conditions[c], total_num_of_dots=total_num)\n", + " model = random.choice(models)\n", + " if 'gemini' in model:\n", + " response = generate(prompt)\n", + " else:\n", + " response = generate_llama(prompt, model)\n", + " accuracy = get_accuracy(response, direction)\n", + " if is_sleep:\n", + " time.sleep(4)\n", + " data['coherence'].append(coherence)\n", + " data['direction'].append(direction)\n", + " data['num_of_dots'].append(timestep)\n", + " data['prompt'].append(prompt)\n", + " data['response'].append(response)\n", + " data['accuracy'].append(accuracy)\n", + " data['model'].append(model)\n", + " data['condition'].append(c)\n", + " data['total_num_of_dots'] = total_num\n", + " print('.', end='')\n", + " i+=1\n", + " if not i % len(coherences):\n", + " print('')\n", + " with open('stabFlex.json', 'w') as f:\n", + " json.dump(data, f)" + ], + "id": "4396c572f3ea5611", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n", + "......\n" + ] + } + ], + "execution_count": 50 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-09T11:29:58.915017Z", + "start_time": "2024-11-09T11:29:58.903109Z" + } + }, + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "with open('stabFlex.json', 'r') as f:\n", + " data = json.load(f)\n", + " \n", + "df = pd.DataFrame(data)\n", + "\n", + "result = df.groupby(['num_of_dots', 'coherence'])['accuracy'].value_counts().unstack()\n", + "print(result)\n", + "# # for each num dots. Get the number or 'correct', 'incorrect' and none values\n", + "# \n", + "# \n", + "# \n", + "# print(df['coherence'].unique())\n", + "# # remove all rows where coherenc is above 1 or below 0\n", + "# df = df[df['coherence'] <= 1]\n", + "# df = df[df['model'] != 'llama3-8']\n", + "# \n", + "# # use get_accuracy to get the accuracy in each row \n", + "# df['accuracy_new'] = df.apply(lambda x: get_accuracy(x['response'], x['direction']), axis=1)\n", + "# df.to_csv('psychometric.csv')\n", + "# \n", + "# df = df[df['num_of_dots'] == 100]\n", + "# \n", + "# \n", + "# # plot the data mean coherence vs mean accuracy with model as hue\n", + "# plt.figure(figsize=(10, 6))\n", + "# \n", + "# \n", + "# for m in df['model'].unique():\n", + "# plt.plot(df[df['model'] == m].groupby('coherence')['coherence'].mean(), df[df['model'] == m].groupby('coherence')['accuracy_new'].mean(), 'o')\n", + "# plt.errorbar(df.groupby('coherence')['coherence'].mean(), df.groupby('coherence')['accuracy_new'].mean())\n", + "# \n", + "# \n", + "# # plot the full average\n", + "# plt.xlabel('Coherence')\n", + "# plt.ylabel('Accuracy')\n", + "# plt.title('Accuracy vs Coherence')\n", + "# plt.legend(df['model'].unique())\n", + "# plt.show()\n", + "# \n", + "# \n", + "# \n", + "# # plot the data points\n", + "# \n", + "# # plt.plot(df.groupby('coherence')['accuracy'].mean())\n", + "# \n", + "# plt.show()" + ], + "id": "4560ee0b26d601ec", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy False True continue\n", + "num_of_dots coherence \n", + "10 0.5 1.0 2.0 7.0\n", + " 0.6 NaN 2.0 7.0\n", + " 0.7 NaN 3.0 6.0\n", + " 0.8 NaN 5.0 4.0\n", + " 0.9 NaN 8.0 1.0\n", + " 1.0 NaN 8.0 1.0\n", + "20 0.5 4.0 NaN 4.0\n", + " 0.6 1.0 2.0 5.0\n", + " 0.7 NaN 7.0 1.0\n", + " 0.8 NaN 7.0 1.0\n", + " 0.9 NaN 8.0 NaN\n", + " 1.0 NaN 8.0 NaN\n", + "30 0.5 1.0 1.0 5.0\n", + " 0.6 NaN 4.0 2.0\n", + " 0.7 1.0 2.0 3.0\n", + " 0.8 NaN 6.0 NaN\n", + " 0.9 1.0 5.0 NaN\n", + " 1.0 NaN 6.0 NaN\n", + "40 0.5 3.0 1.0 2.0\n", + " 0.6 NaN 3.0 3.0\n", + " 0.7 NaN 5.0 1.0\n", + " 0.8 NaN 6.0 NaN\n", + " 0.9 1.0 5.0 NaN\n", + " 1.0 NaN 6.0 NaN\n", + "50 0.5 3.0 NaN 3.0\n", + " 0.6 NaN 4.0 2.0\n", + " 0.7 2.0 4.0 NaN\n", + " 0.8 NaN 6.0 NaN\n", + " 0.9 NaN 5.0 1.0\n", + " 1.0 NaN 6.0 NaN\n", + "60 0.5 3.0 1.0 2.0\n", + " 0.6 NaN 2.0 4.0\n", + " 0.7 NaN 6.0 NaN\n", + " 0.8 NaN 6.0 NaN\n", + " 0.9 NaN 6.0 NaN\n", + " 1.0 NaN 6.0 NaN\n", + "70 0.5 3.0 2.0 NaN\n", + " 0.6 NaN 4.0 1.0\n", + " 0.7 NaN 4.0 NaN\n", + " 0.8 1.0 3.0 NaN\n", + " 0.9 1.0 3.0 NaN\n", + " 1.0 NaN 4.0 NaN\n", + "80 0.5 2.0 NaN 2.0\n", + " 0.6 1.0 3.0 NaN\n", + " 0.7 1.0 2.0 1.0\n", + " 0.8 2.0 2.0 NaN\n", + " 0.9 1.0 2.0 1.0\n", + " 1.0 NaN 4.0 NaN\n", + "90 0.5 NaN 3.0 1.0\n", + " 0.6 1.0 2.0 1.0\n", + " 0.7 NaN 4.0 NaN\n", + " 0.8 1.0 3.0 NaN\n", + " 0.9 NaN 4.0 NaN\n", + " 1.0 NaN 4.0 NaN\n", + "100 0.5 1.0 1.0 1.0\n", + " 0.6 NaN 2.0 NaN\n", + " 0.7 NaN NaN 2.0\n", + " 0.8 NaN 2.0 NaN\n", + " 0.9 NaN 2.0 NaN\n", + " 1.0 NaN 2.0 NaN\n" + ] + } + ], + "execution_count": 49 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "9803a1892f473ca5" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/AI Experiment/google_api.py b/examples/AI Experiment/google_api.py index 3c9147b..93d2509 100644 --- a/examples/AI Experiment/google_api.py +++ b/examples/AI Experiment/google_api.py @@ -9,10 +9,16 @@ from vertexai.generative_models import GenerativeModel, SafetySetting -def generate(prompt): +def generate(prompt, model="gemini-1.5-flash-002", max_tokens=5): + generation_config = { + "max_output_tokens": max_tokens, + "temperature": 1, + "top_p": 0.95, + "stop_sequences": [">>"], + } vertexai.init(project="auto-centauer", location="us-central1") model = GenerativeModel( - "gemini-1.5-flash-002", + model, ) responses = model.generate_content( [prompt], @@ -25,6 +31,12 @@ def generate(prompt): def multiturn_generate(system_instruction, prompt): + generation_config = { + "max_output_tokens": 5, + "temperature": 1, + "top_p": 0.95, + "stop_sequences": [">>"], + } vertexai.init(project="auto-centauer", location="us-central1") model = GenerativeModel( "gemini-1.5-flash-002", system_instruction=[system_instruction] @@ -39,13 +51,6 @@ def multiturn_generate(system_instruction, prompt): ) -generation_config = { - "max_output_tokens": 1, - "temperature": 1, - "top_p": 0.95, - "stop_sequences": [">>"], -} - safety_settings = [ SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, diff --git a/examples/AI Experiment/llama_api.py b/examples/AI Experiment/llama_api.py new file mode 100644 index 0000000..5e9d3fc --- /dev/null +++ b/examples/AI Experiment/llama_api.py @@ -0,0 +1,17 @@ +from openai import OpenAI + +client = OpenAI( + api_key="LA-5dadfd9796ea4d6b9273d3fc4a0cd55f3f0130003ccd483180586be48e47d859", + base_url="https://api.llama-api.com", +) + + +def generate_llama(prompt, model="llama3.1-70b", max_tokens=5): + response = client.chat.completions.create( + model=model, + messages=[{"role": "user", "content": prompt}], + max_tokens=max_tokens, + temperature=1, + ) + + return response.choices[0].message.content diff --git a/pyproject.toml b/pyproject.toml index dc8702c..6bfb3f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,9 @@ docs = [ "mkdocstrings-python", "mkdocs-jupyter", "pymdown-extensions", + "notebook", + "jupyter", + "jupyterlab", ] [project.urls]