forked from google-gemini/cookbook
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert "Remove templates directory."
This reverts commit 7c1e47f.
- Loading branch information
1 parent
7c1e47f
commit e2623e8
Showing
3 changed files
with
499 additions
and
0 deletions.
There are no files selected for viewing
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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": [ | ||
"<table class=\"tfo-notebook-buttons\" align=\"left\">\n", | ||
" <td>\n", | ||
" <a target=\"_blank\" href=\"https://ai.google.dev/gemini-api/docs\"><img src=\"https://ai.google.dev/static/site-assets/images/docs/notebook-site-button.png\" height=\"32\" width=\"32\" />Docs on ai.google.dev</a>\n", | ||
" </td>\n", | ||
" <td>\n", | ||
" <a target=\"_blank\" href=\"https://github.com/google-gemini/cookbook/blob/main/quickstarts\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />More notebooks in the Cookbook</a>\n", | ||
" </td>\n", | ||
"</table>" | ||
] | ||
}, | ||
{ | ||
"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 | ||
} |
Oops, something went wrong.