diff --git a/docs/ais-templates/aistudio_gemini_prompt_freeform.ipynb b/docs/ais-templates/aistudio_gemini_prompt_freeform.ipynb
new file mode 100644
index 000000000..f53d3b2a5
--- /dev/null
+++ b/docs/ais-templates/aistudio_gemini_prompt_freeform.ipynb
@@ -0,0 +1,332 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Tce3stUlHN0L"
+ },
+ "source": [
+ "##### Copyright 2023 Google LLC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "cellView": "form",
+ "id": "tuOe1ymfHZPu"
+ },
+ "outputs": [],
+ "source": [
+ "# @title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
+ "# you may not use this file except in compliance with the License.\n",
+ "# You may obtain a copy of the License at\n",
+ "#\n",
+ "# https://www.apache.org/licenses/LICENSE-2.0\n",
+ "#\n",
+ "# Unless required by applicable law or agreed to in writing, software\n",
+ "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
+ "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
+ "# See the License for the specific language governing permissions and\n",
+ "# limitations under the License."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "FKwyTRdwB8aW"
+ },
+ "source": [
+ "## Setup"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "RXInneX6xx7c"
+ },
+ "outputs": [],
+ "source": [
+ "!pip install -U -q \"google-generativeai>=0.8.2\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "cellView": "form",
+ "id": "kWIuwKG2_oWE"
+ },
+ "outputs": [],
+ "source": [
+ "# import necessary modules.\n",
+ "import base64\n",
+ "import copy\n",
+ "import json\n",
+ "import pathlib\n",
+ "import requests\n",
+ "\n",
+ "\n",
+ "import PIL.Image\n",
+ "import IPython.display\n",
+ "from IPython.display import Markdown\n",
+ "\n",
+ "try:\n",
+ " # The SDK will automatically read it from the GOOGLE_API_KEY environment variable.\n",
+ " # In Colab get the key from Colab-secrets (\"🔑\" in the left panel).\n",
+ " import os\n",
+ " from google.colab import userdata\n",
+ "\n",
+ " os.environ[\"GOOGLE_API_KEY\"] = userdata.get(\"GOOGLE_API_KEY\")\n",
+ "except ImportError:\n",
+ " pass\n",
+ "\n",
+ "import google.generativeai as genai\n",
+ "\n",
+ "# Parse the arguments\n",
+ "\n",
+ "model = \"gemini-1.5-flash\" # @param {isTemplate: true}\n",
+ "contents_b64 = \"W3sicGFydHMiOiBbeyJ0ZXh0IjogIldoYXQncyBpbiB0aGlzIHBpY3R1cmU/In0sIHsiZmlsZV9kYXRhIjogeyJ1cmwiOiAiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dlbmVyYXRpdmVhaS1kb3dubG9hZHMvaW1hZ2VzL3Njb25lcy5qcGciLCAibWltZV90eXBlIjogImltYWdlL2pwZWcifX1dfV0=\" # @param {isTemplate: true}\n",
+ "generation_config_b64 = \"e30=\" # @param {isTemplate: true}\n",
+ "safety_settings_b64 = \"e30=\" # @param {isTemplate: true}\n",
+ "\n",
+ "gais_contents = json.loads(base64.b64decode(contents_b64))\n",
+ "\n",
+ "generation_config = json.loads(base64.b64decode(generation_config_b64))\n",
+ "safety_settings = json.loads(base64.b64decode(safety_settings_b64))\n",
+ "\n",
+ "stream = False\n",
+ "\n",
+ "# Convert and upload the files\n",
+ "\n",
+ "tempfiles = pathlib.Path(f\"tempfiles\")\n",
+ "tempfiles.mkdir(parents=True, exist_ok=True)\n",
+ "\n",
+ "\n",
+ "drive = None\n",
+ "def upload_file_data(file_data, index):\n",
+ " \"\"\"Upload files to the Files API.\n",
+ "\n",
+ " For each file, Google AI Studio either sent:\n",
+ " - a Google Drive ID,\n",
+ " - a URL,\n",
+ " - a file path, or\n",
+ " - The raw bytes (`inline_data`).\n",
+ "\n",
+ " The API only understands `inline_data` or it's Files API.\n",
+ " This code, uploads files to the files API where the API can access them.\n",
+ " \"\"\"\n",
+ "\n",
+ " mime_type = file_data[\"mime_type\"]\n",
+ " if drive_id := file_data.pop(\"drive_id\", None):\n",
+ " if drive is None:\n",
+ " from google.colab import drive\n",
+ " drive.mount(\"/gdrive\")\n",
+ "\n",
+ " path = next(\n",
+ " pathlib.Path(f\"/gdrive/.shortcut-targets-by-id/{drive_id}\").glob(\"*\")\n",
+ " )\n",
+ " print(\"Uploading:\", str(path))\n",
+ " file_info = genai.upload_file(path=path, mime_type=mime_type)\n",
+ " file_data[\"file_uri\"] = file_info.uri\n",
+ " return\n",
+ "\n",
+ " if url := file_data.pop(\"url\", None):\n",
+ " response = requests.get(url)\n",
+ " data = response.content\n",
+ " name = url.split(\"/\")[-1]\n",
+ " path = tempfiles / str(index)\n",
+ " path.write_bytes(data)\n",
+ " print(\"Uploading:\", url)\n",
+ " file_info = genai.upload_file(path, display_name=name, mime_type=mime_type)\n",
+ " file_data[\"file_uri\"] = file_info.uri\n",
+ " return\n",
+ "\n",
+ " if name := file_data.get(\"filename\", None):\n",
+ " if not pathlib.Path(name).exists():\n",
+ " raise IOError(\n",
+ " f\"local file: `{name}` does not exist. You can upload files \"\n",
+ " 'to Colab using the file manager (\"📁 Files\" in the left '\n",
+ " \"toolbar)\"\n",
+ " )\n",
+ " file_info = genai.upload_file(path, display_name=name, mime_type=mime_type)\n",
+ " file_data[\"file_uri\"] = file_info.uri\n",
+ " return\n",
+ "\n",
+ " if \"inline_data\" in file_data:\n",
+ " return\n",
+ "\n",
+ " raise ValueError(\"Either `drive_id`, `url` or `inline_data` must be provided.\")\n",
+ "\n",
+ "\n",
+ "contents = copy.deepcopy(gais_contents)\n",
+ "\n",
+ "index = 0\n",
+ "for content in contents:\n",
+ " for n, part in enumerate(content[\"parts\"]):\n",
+ " if file_data := part.get(\"file_data\", None):\n",
+ " upload_file_data(file_data, index)\n",
+ " index += 1\n",
+ "\n",
+ "import json\n",
+ "print(json.dumps(contents, indent=4))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "E7zAD69vE92b"
+ },
+ "source": [
+ "## Call `generate_content`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "LB2LxPmAB95V"
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import display\n",
+ "from IPython.display import Markdown\n",
+ "\n",
+ "# Call the model and print the response.\n",
+ "gemini = genai.GenerativeModel(model_name=model)\n",
+ "\n",
+ "response = gemini.generate_content(\n",
+ " contents,\n",
+ " generation_config=generation_config,\n",
+ " safety_settings=safety_settings,\n",
+ " stream=stream,\n",
+ ")\n",
+ "\n",
+ "display(Markdown(response.text))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9c9d345e9868"
+ },
+ "source": [
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "F91AeeGO1ncU"
+ },
+ "source": [
+ "## [optional] Show the conversation\n",
+ "\n",
+ "This section displays the conversation received from Google AI Studio."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "cellView": "form",
+ "id": "yoL3p3KPylFW"
+ },
+ "outputs": [],
+ "source": [
+ "# @title Show the conversation, in colab.\n",
+ "import mimetypes\n",
+ "\n",
+ "def show_file(file_data):\n",
+ " mime_type = file_data[\"mime_type\"]\n",
+ "\n",
+ " if drive_id := file_data.get(\"drive_id\", None):\n",
+ " path = next(\n",
+ " pathlib.Path(f\"/gdrive/.shortcut-targets-by-id/{drive_id}\").glob(\"*\")\n",
+ " )\n",
+ " name = path\n",
+ " # data = path.read_bytes()\n",
+ " kwargs = {\"filename\": path}\n",
+ " elif url := file_data.get(\"url\", None):\n",
+ " name = url\n",
+ " kwargs = {\"url\": url}\n",
+ " # response = requests.get(url)\n",
+ " # data = response.content\n",
+ " elif data := file_data.get(\"inline_data\", None):\n",
+ " name = None\n",
+ " kwargs = {\"data\": data}\n",
+ " elif name := file_data.get(\"filename\", None):\n",
+ " if not pathlib.Path(name).exists():\n",
+ " raise IOError(\n",
+ " f\"local file: `{name}` does not exist. You can upload files to \"\n",
+ " 'Colab using the file manager (\"📁 Files\"in the left toolbar)'\n",
+ " )\n",
+ " else:\n",
+ " raise ValueError(\"Either `drive_id`, `url` or `inline_data` must be provided.\")\n",
+ "\n",
+ " print(f\"File:\\n name: {name}\\n mime_type: {mime_type}\\n\")\n",
+ " return\n",
+ "\n",
+ " format = mimetypes.guess_extension(mime_type).strip(\".\")\n",
+ " if mime_type.startswith(\"image/\"):\n",
+ " image = IPython.display.Image(**kwargs, width=256)\n",
+ " IPython.display.display(image)\n",
+ " print()\n",
+ " return\n",
+ "\n",
+ " if mime_type.startswith(\"audio/\"):\n",
+ " if len(data) < 2**12:\n",
+ " audio = IPython.display.Audio(**kwargs)\n",
+ " IPython.display.display(audio)\n",
+ " print()\n",
+ " return\n",
+ "\n",
+ " if mime_type.startswith(\"video/\"):\n",
+ " if len(data) < 2**12:\n",
+ " audio = IPython.display.Video(**kwargs, mimetype=mime_type)\n",
+ " IPython.display.display(audio)\n",
+ " print()\n",
+ " return\n",
+ "\n",
+ " print(f\"File:\\n name: {name}\\n mime_type: {mime_type}\\n\")\n",
+ "\n",
+ "\n",
+ "for content in gais_contents:\n",
+ " if role := content.get(\"role\", None):\n",
+ " print(\"Role:\", role, \"\\n\")\n",
+ "\n",
+ " for n, part in enumerate(content[\"parts\"]):\n",
+ " if text := part.get(\"text\", None):\n",
+ " print(text, \"\\n\")\n",
+ "\n",
+ " elif file_data := part.get(\"file_data\", None):\n",
+ " show_file(file_data)\n",
+ "\n",
+ " print(\"-\" * 80, \"\\n\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "collapsed_sections": [
+ "Tce3stUlHN0L"
+ ],
+ "name": "aistudio_gemini_prompt_freeform.ipynb",
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/docs/ais-templates/aistudio_gemini_prompt_freeform_nofiles.ipynb b/docs/ais-templates/aistudio_gemini_prompt_freeform_nofiles.ipynb
new file mode 100644
index 000000000..5182f136b
--- /dev/null
+++ b/docs/ais-templates/aistudio_gemini_prompt_freeform_nofiles.ipynb
@@ -0,0 +1,167 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Tce3stUlHN0L"
+ },
+ "source": [
+ "##### Copyright 2023 Google LLC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "cellView": "form",
+ "id": "tuOe1ymfHZPu"
+ },
+ "outputs": [],
+ "source": [
+ "# @title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
+ "# you may not use this file except in compliance with the License.\n",
+ "# You may obtain a copy of the License at\n",
+ "#\n",
+ "# https://www.apache.org/licenses/LICENSE-2.0\n",
+ "#\n",
+ "# Unless required by applicable law or agreed to in writing, software\n",
+ "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
+ "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
+ "# See the License for the specific language governing permissions and\n",
+ "# limitations under the License."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "FKwyTRdwB8aW"
+ },
+ "source": [
+ "## Setup"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "RXInneX6xx7c"
+ },
+ "outputs": [],
+ "source": [
+ "!pip install -U -q \"google-generativeai>=0.8.2\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "cellView": "form",
+ "id": "kWIuwKG2_oWE"
+ },
+ "outputs": [],
+ "source": [
+ "# import necessary modules.\n",
+ "\n",
+ "import google.generativeai as genai\n",
+ "\n",
+ "import base64\n",
+ "import json\n",
+ "\n",
+ "try:\n",
+ " # Mount google drive\n",
+ " from google.colab import drive\n",
+ "\n",
+ " drive.mount(\"/gdrive\")\n",
+ "\n",
+ " # The SDK will automatically read it from the GOOGLE_API_KEY environment variable.\n",
+ " # In Colab get the key from Colab-secrets (\"🔑\" in the left panel).\n",
+ " import os\n",
+ " from google.colab import userdata\n",
+ "\n",
+ " os.environ[\"GOOGLE_API_KEY\"] = userdata.get(\"GOOGLE_API_KEY\")\n",
+ "except ImportError:\n",
+ " pass\n",
+ "\n",
+ "# Parse the arguments\n",
+ "\n",
+ "model = \"gemini-1.5-flash\" # @param {isTemplate: true}\n",
+ "contents_b64 = b'W3sicGFydHMiOiBbeyJ0ZXh0IjogIkhlbGxvIn1dfV0='\n",
+ "generation_config_b64 = \"e30=\" # @param {isTemplate: true}\n",
+ "safety_settings_b64 = \"e30=\" # @param {isTemplate: true}\n",
+ "\n",
+ "contents = json.loads(base64.b64decode(contents_b64))\n",
+ "\n",
+ "generation_config = json.loads(base64.b64decode(generation_config_b64))\n",
+ "safety_settings = json.loads(base64.b64decode(safety_settings_b64))\n",
+ "\n",
+ "stream = False\n",
+ "\n",
+ "print(json.dumps(contents, indent=4))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "E7zAD69vE92b"
+ },
+ "source": [
+ "## Call `generate_content`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "LB2LxPmAB95V"
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import display\n",
+ "from IPython.display import Markdown\n",
+ "\n",
+ "# Call the model and print the response.\n",
+ "gemini = genai.GenerativeModel(model_name=model)\n",
+ "\n",
+ "response = gemini.generate_content(\n",
+ " contents,\n",
+ " generation_config=generation_config,\n",
+ " safety_settings=safety_settings,\n",
+ " stream=stream,\n",
+ ")\n",
+ "\n",
+ "display(Markdown(response.text))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9c9d345e9868"
+ },
+ "source": [
+ ""
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "collapsed_sections": [
+ "Tce3stUlHN0L"
+ ],
+ "name": "aistudio_gemini_prompt_freeform_nofiles.ipynb",
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}