gemini/use-cases/productivity/slide_generation_with_marp.ipynb (408 lines of code) (raw):
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sqi5B7V_Rjim"
},
"outputs": [],
"source": [
"# Copyright 2025 Google LLC\n",
"#\n",
"# 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": "VyPmicX9RlZX"
},
"source": [
"# Slide Generation with Gemini and Marp\n",
"\n",
"<table align=\"left\">\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://colab.research.google.com/github/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\">\n",
" <img width=\"32px\" src=\"https://www.gstatic.com/pantheon/images/bigquery/welcome_page/colab-logo.svg\" alt=\"Google Colaboratory logo\"><br> Open in Colab\n",
" </a>\n",
" </td>\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://console.cloud.google.com/vertex-ai/colab/import/https:%2F%2Fraw.githubusercontent.com%2FGoogleCloudPlatform%2Fgenerative-ai%2Fmain%2Fgemini%2Fuse-cases%2Fproductivity%2Fslide_generation_with_marp.ipynb\">\n",
" <img width=\"32px\" src=\"https://lh3.googleusercontent.com/JmcxdQi-qOpctIvWKgPtrzZdJJK-J3sWE1RsfjZNwshCFgE_9fULcNpuXYTilIR2hjwN\" alt=\"Google Cloud Colab Enterprise logo\"><br> Open in Colab Enterprise\n",
" </a>\n",
" </td>\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://console.cloud.google.com/vertex-ai/workbench/deploy-notebook?download_url=https://raw.githubusercontent.com/GoogleCloudPlatform/generative-ai/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\">\n",
" <img src=\"https://www.gstatic.com/images/branding/gcpiconscolors/vertexai/v1/32px.svg\" alt=\"Vertex AI logo\"><br> Open in Vertex AI Workbench\n",
" </a>\n",
" </td>\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\">\n",
" <img width=\"32px\" src=\"https://www.svgrepo.com/download/217753/github.svg\" alt=\"GitHub logo\"><br> View on GitHub\n",
" </a>\n",
" </td>\n",
"</table>\n",
"\n",
"<div style=\"clear: both;\"></div>\n",
"\n",
"<b>Share to:</b>\n",
"\n",
"<a href=\"https://www.linkedin.com/sharing/share-offsite/?url=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/8/81/LinkedIn_icon.svg\" alt=\"LinkedIn logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://bsky.app/intent/compose?text=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg\" alt=\"Bluesky logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://twitter.com/intent/tweet?url=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/5/5a/X_icon_2.svg\" alt=\"X logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://reddit.com/submit?url=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://redditinc.com/hubfs/Reddit%20Inc/Brand/Reddit_Logo.png\" alt=\"Reddit logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://www.facebook.com/sharer/sharer.php?u=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/productivity/slide_generation_with_marp.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/5/51/Facebook_f_logo_%282019%29.svg\" alt=\"Facebook logo\">\n",
"</a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8MqT58L6Rm_q"
},
"source": [
"| | |\n",
"|-|-|\n",
"| Author(s) | [Paige Bailey](https://github.com/dynamicwebpaige), [Holt Skinner](https://github.com/holtskinner) |"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nVxnv1D5RoZw"
},
"source": [
"## Overview\n",
"\n",
"[Marp](https://marp.app/) is a framework for creating slide decks using Markdown.\n",
"\n",
"This notebook shows how to use the Gemini API and the Google Gen AI SDK for Python to convert a blog post into a slide deck overview.\n",
"\n",
"You will complete the following tasks:\n",
"\n",
"- Use [Gitingest](https://gitingest.com/) to load the Marp repository as a large string.\n",
"- Send the Marp repository and a blog post URL to the Gemini API.\n",
"- Parse the markdown output from Gemini\n",
"- Send markdown to [Marp CLI](https://github.com/marp-team/marp-cli) to convert to PDF."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gPiTOAHURvTM"
},
"source": [
"## Getting Started"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CHRZUpfWSEpp"
},
"source": [
"### Install Google Gen AI SDK for Python\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sG3_LKsWSD3A"
},
"outputs": [],
"source": [
"%pip install --upgrade --quiet google-genai gitingest"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HlMVjiAWSMNX"
},
"source": [
"### Authenticate your notebook environment (Colab only)\n",
"\n",
"If you are running this notebook on Google Colab, run the cell below to authenticate your environment."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "12fnq4V0SNV3"
},
"outputs": [],
"source": [
"import sys\n",
"\n",
"if \"google.colab\" in sys.modules:\n",
" from google.colab import auth\n",
"\n",
" auth.authenticate_user()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ve4YBlDqzyj9"
},
"source": [
"### Connect to a generative AI API service\n",
"\n",
"Google Gen AI APIs and models including Gemini are available in the following two API services:\n",
"\n",
"- **[Google AI for Developers](https://ai.google.dev/gemini-api/docs)**: Experiment, prototype, and deploy small projects.\n",
"- **[Vertex AI](https://cloud.google.com/vertex-ai/generative-ai/docs/overview)**: Build enterprise-ready projects on Google Cloud.\n",
"\n",
"The Google Gen AI SDK provides a unified interface to these two API services.\n",
"\n",
"This notebook shows how to use the Google Gen AI SDK with the Gemini API in Vertex AI."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LymmEN6GSTn-"
},
"source": [
"### Set Google Cloud project information and create client\n",
"\n",
"To get started using Vertex AI, you must have an existing Google Cloud project and [enable the Vertex AI API](https://console.cloud.google.com/flows/enableapi?apiid=aiplatform.googleapis.com).\n",
"\n",
"Learn more about [setting up a project and a development environment](https://cloud.google.com/vertex-ai/docs/start/cloud-environment)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "UCgUOv4nSWhc"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"PROJECT_ID = \"[your-project-id]\" # @param {type: \"string\", placeholder: \"[your-project-id]\", isTemplate: true}\n",
"if not PROJECT_ID or PROJECT_ID == \"[your-project-id]\":\n",
" PROJECT_ID = str(os.environ.get(\"GOOGLE_CLOUD_PROJECT\"))\n",
"\n",
"LOCATION = os.environ.get(\"GOOGLE_CLOUD_REGION\", \"us-central1\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4ohJK8VpUoYz"
},
"outputs": [],
"source": [
"from google import genai\n",
"\n",
"client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EdvJRUWRNGHE"
},
"source": [
"### Import libraries\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "qgdSpVmDbdQ9"
},
"outputs": [],
"source": [
"import re\n",
"\n",
"from IPython.display import Markdown, display\n",
"from gitingest import ingest\n",
"from google.genai.types import GenerateContentConfig, Part\n",
"import nest_asyncio\n",
"\n",
"nest_asyncio.apply()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eXHJi5B6P5vd"
},
"source": [
"### Load the Gemini 2.0 Flash Thinking model\n",
"\n",
"Learn more about all [Gemini models on Vertex AI](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-models)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "-coEslfWPrxo"
},
"outputs": [],
"source": [
"MODEL_ID = \"gemini-2.0-flash-thinking-exp-01-21\" # @param {type: \"string\"}"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "37CH91ddY9kG"
},
"source": [
"### Load the Marp repository"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "0M-0Nd8aUoY0"
},
"outputs": [],
"source": [
"repo_dir = \"https://github.com/marp-team/marp\"\n",
"\n",
"summary, tree, content = ingest(source=repo_dir, branch=\"main\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "f5a0e244a04c"
},
"source": [
"### Send the Marp codebase and blog post in prompt to Gemini"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "_HgBRR43UoY0"
},
"outputs": [],
"source": [
"PROMPT = \"\"\"\n",
"Please create a slide overview version of this website (about DeepMind's AI Co-scientist), using the same kind of style and formatting. Link to all of the images in the Marp deck (especially .mp4 files and .GIF). I've also included the Marp codebase, so you can refer back to it for design changes. Make sure that the text is appropriately sized for each slide (keep it quite small, or divide up extra long text into multiple slides), and make sure that the images are placed in well-designed locations.\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "xRJuHj0KZ8xz"
},
"outputs": [],
"source": [
"response = client.models.generate_content(\n",
" model=MODEL_ID,\n",
" contents=[\n",
" content,\n",
" PROMPT,\n",
" Part.from_uri(\n",
" file_uri=\"https://research.google/blog/accelerating-scientific-breakthroughs-with-an-ai-co-scientist/\",\n",
" mime_type=\"text/html\",\n",
" ),\n",
" ],\n",
" config=GenerateContentConfig(\n",
" system_instruction=\"Only output markdown.\",\n",
" max_output_tokens=8192,\n",
" ),\n",
")\n",
"\n",
"display(Markdown(response.text))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "c94b81f8b851"
},
"source": [
"### Parse response from Gemini"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "CKUWjwbkXkgD"
},
"outputs": [],
"source": [
"marp_text = re.findall(r\"```(?:\\w*\\n)?(.*?)```\", response.text + \"\\n```\", re.DOTALL)[0]\n",
"\n",
"with open(\"slide-deck.md\", \"w\") as f:\n",
" f.write(marp_text)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ht5VnDnNdrbt"
},
"source": [
"### Convert Markdown to a PDF\n",
"\n",
"> **NOTE:** This will only work on a machine with a web browser installed. Colab is not supported."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "CWIU2ir_cBC9"
},
"outputs": [],
"source": [
"!npx @marp-team/marp-cli@latest slide-deck.md --pdf"
]
}
],
"metadata": {
"colab": {
"name": "slide_generation_with_marp.ipynb",
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}