diff --git a/python-recipes/agents/05_agent_framework_agent.ipynb b/python-recipes/agents/05_agent_framework_agent.ipynb
new file mode 100644
index 0000000..a5a1621
--- /dev/null
+++ b/python-recipes/agents/05_agent_framework_agent.ipynb
@@ -0,0 +1,1365 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "a9U6R3RkGoCx"
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Agentic tasks with Agent Framework and Redis\n",
+ "\n",
+ "This notebook demonstrates how to build an agent using Microsoft's [Agent Framework](https://github.com/microsoft/agent-framework/tree/main).\n",
+ "\n",
+ "It adapts the work found in [Redis-AI-Resources Autogen Agent Tutorial](https://github.com/redis-developer/redis-ai-resources/blob/main/python-recipes/agents/04_autogen_agent.ipynb), and simply applies the setting in Agent Framework instead.\n",
+ "\n",
+ "We'll define an agent, give it access to tools and memory, then set in on a task to see how it uses its abilities.\n",
+ "\n",
+ "## Note\n",
+ "Agent Framework relies on either the OpenAI or AzureOpenAI API for LLM capability. This notebook will rely on the OpenAI API.\n",
+ "\n",
+ "## Let's Begin!\n",
+ "\n",
+ "
\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "Yx5yx41OVOBw",
+ "outputId": "dcff6959-305d-4dd6-c205-aaee1278a356"
+ },
+ "outputs": [],
+ "source": [
+ "%pip install agent-framework --pre\n",
+ "%pip install -q \"redisvl>=0.8.0\" sentence-transformers openai tiktoken python-dotenv redis google pandas requests"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sc4Jn-UYaohD"
+ },
+ "source": [
+ "## For Colab download and run a Redis instance\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "_ujoLxHWaoCK",
+ "outputId": "a51733ed-dfae-4860-b6b9-1093c36ffbe0"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb jammy main\n",
+ "Starting redis-stack-server, database path /var/lib/redis-stack\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "gpg: cannot open '/dev/tty': No such device or address\n",
+ "curl: (23) Failed writing body\n"
+ ]
+ }
+ ],
+ "source": [
+ "# NBVAL_SKIP\n",
+ "%%sh\n",
+ "curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg\n",
+ "echo \"deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main\" | sudo tee /etc/apt/sources.list.d/redis.list\n",
+ "sudo apt-get update > /dev/null 2>&1\n",
+ "sudo apt-get install redis-stack-server > /dev/null 2>&1\n",
+ "redis-stack-server --daemonize yes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XSCgi3Ppa6B1"
+ },
+ "source": [
+ "## Format plain text into Markdown-style blockquotes for display in a Colab notebook"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "id": "idsIktqlVpYb"
+ },
+ "outputs": [],
+ "source": [
+ "import textwrap\n",
+ "\n",
+ "from IPython.display import display\n",
+ "from IPython.display import Markdown\n",
+ "\n",
+ "def to_markdown(text):\n",
+ " text = text.replace('•', ' *')\n",
+ " return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sWNdJqBTa_Ff"
+ },
+ "source": [
+ "## Import Dependencies"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "id": "IJsiE43wWSdC"
+ },
+ "outputs": [],
+ "source": [
+ "import asyncio\n",
+ "import os\n",
+ "\n",
+ "import json\n",
+ "import os\n",
+ "import re\n",
+ "import requests\n",
+ "from collections import Counter\n",
+ "from typing import List"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "AMlNJ8u4HMNr",
+ "outputId": "1cf55d70-d604-4814-8d95-fd5fa889e0d9"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Connecting to Redis at: redis://localhost:6379\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Use the environment variable if set, otherwise default to localhost\n",
+ "REDIS_URL = os.getenv(\"REDIS_URL\", \"redis://localhost:6379\")\n",
+ "print(f\"Connecting to Redis at: {REDIS_URL}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "neDrDDx9HOiG"
+ },
+ "source": [
+ "## Building our agent\n",
+ "\n",
+ "We'll be building a restaurant review writing agent that takes in a set of restaurant reviews, collects relevant information, and provides a summary and analysis you can use for SEO."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Wc7tFmQAHRe_"
+ },
+ "source": [
+ "### Defining tools\n",
+ "One of the defining the features of an agent is its ability to use tools so let's give it some. Our agent will decide when to call each tool, construct the appropriate arguments, then retrieve and utilize the results.\n",
+ "\n",
+ "With Autogen that just requires we define a well named function with type hints in its signature.\n",
+ "\n",
+ "We will have three main tools:\n",
+ "1. A `summarize()` function that can take in a collection of reviews and boil them all down to a single summary.\n",
+ "2. A `get_keywords()` function to count the most common words present in the article, becuase LLM's often struggle with character counting.\n",
+ "3. A `publish_article()` function that will write our final article to a separate file we can then upload elsewhere."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "id": "cur0F0M3HURD"
+ },
+ "outputs": [],
+ "source": [
+ "\n",
+ "async def summarize(restaurant_name: str, all_reviews: List[str]) -> str:\n",
+ " \"\"\"takes a list of reviews for a single restaurant and returns a summary of all of them.\"\"\"\n",
+ " # set up a summarizer model\n",
+ " summarizer = pipeline('summarization', model='facebook/bart-large-cnn')\n",
+ " # pass all the reviews\n",
+ " summary = summarizer('\\n'.join(all_reviews), # concatenate all the reviews together\n",
+ " max_length=1024,\n",
+ " min_length=128,\n",
+ " do_sample=False)[0][\"summary_text\"]\n",
+ " return restaurant_name + \": \" + summary\n",
+ "\n",
+ "\n",
+ "async def get_keywords(full_text: str) -> List[str]:\n",
+ " \"\"\"extract the most commonly occurring keywords present in the reviews to know\n",
+ " which terms it is likely to rank highly for in keyword search engines.\"\"\"\n",
+ " # define a set of common English stopwords to ignore\n",
+ " STOPWORDS = {\n",
+ " 'the', 'of', 'and', 'to', 'for', 'in', 'on', 'at', 'a', 'an', 'is', 'it', 'its', 'with', 'as', 'by', 'from', 'that',\n",
+ " 'this', 'those', 'be', 'are', 'was', 'were', 'or', 'but', 'not', 'so', 'if', 'then', 'than', 'which', 'who', 'whom',\n",
+ " 'about', 'into', 'out', 'up', 'down', 'over', 'under', 'again', 'further', 'once', 'here', 'there', 'when',\n",
+ " 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no',\n",
+ " 'nor', 'only', 'own', 'same', 'can', 'will', 'just', 'don', 'should', 'now', 'has', 'have', 'had', 'do', 'does',\n",
+ " 'did', 'their', 'them', 'they', 'you', 'your', 'yours', 'he', 'him', 'his', 'she', 'her', 'hers', 'we', 'us',\n",
+ " 'our', 'ours', 'i', 's', 'me', 'my', 'mine', 'also', 'place'\n",
+ " }\n",
+ " # remove punctuation and lowercase the text\n",
+ " words = re.findall(r'\\b\\w+\\b', full_text.lower())\n",
+ " # filter out stopwords\n",
+ " filtered_words = [word for word in words if word not in STOPWORDS]\n",
+ " # count occurrences\n",
+ " word_counts = Counter(filtered_words)\n",
+ " # return the top 10\n",
+ " return [word for word, _ in word_counts.most_common(10)]\n",
+ "\n",
+ "\n",
+ "async def publish_article(final_draft: str, file_name:str= \"food_article.md\") -> str:\n",
+ " \"accepts the final version of an article, writes it to a markdown file and returns the full file location path.\"\n",
+ " with open(file_name, 'w') as file:\n",
+ " file.write(final_draft)\n",
+ "\n",
+ " full_path = os.path.abspath(__file__)\n",
+ " return os.path.join(full_path, file_name)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KjuT0X5WIIKt"
+ },
+ "source": [
+ "## Adding relevant memories\n",
+ "Our agent needs to know what people think of these restaurants so we'll add the user reviews to our agent memory powered by Redis.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "id": "bsPzxix6IJgn"
+ },
+ "outputs": [],
+ "source": [
+ "# fetch the reviews from our public S3 bucket\n",
+ "# the original dataset can be found here: https://www.kaggle.com/datasets/jkgatt/restaurant-data-with-100-trip-advisor-reviews-each\n",
+ "def fetch_data(file_name):\n",
+ " dataset_path = 'datasets/'\n",
+ " try:\n",
+ " with open(dataset_path + file_name, 'r') as f:\n",
+ " return json.load(f)\n",
+ " except:\n",
+ " url = 'https://redis-ai-resources.s3.us-east-2.amazonaws.com/recommenders/datasets/two-towers/'\n",
+ " r = requests.get(url + file_name)\n",
+ " if not os.path.exists(dataset_path):\n",
+ " os.makedirs(dataset_path)\n",
+ " with open(dataset_path + file_name, 'wb') as f:\n",
+ " f.write(r.content)\n",
+ " return json.loads(r.content.decode('utf-8'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Uq9-_1BqIK1r",
+ "outputId": "24f3aa38-3837-4bd8-dccb-7aa304d90640"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "we have 147 restaurants in our dataset, with 14700 total reviews\n"
+ ]
+ }
+ ],
+ "source": [
+ "restaurant_data = fetch_data('factual_tripadvisor_restaurant_data_all_100_reviews.json')\n",
+ "\n",
+ "print(f\"we have {restaurant_data['restaurant_count']} restaurants in our dataset, with {restaurant_data['total_review_count']} total reviews\")\n",
+ "\n",
+ "restaurant_reviews = restaurant_data[\"restaurants\"] # ignore the count fields\n",
+ "\n",
+ "# drop some of the fields that we don't need\n",
+ "for restaurant in restaurant_reviews:\n",
+ " for field in ['region', 'country', 'tel', 'fax', 'email', 'website', 'address_extended', 'chain_name', 'trip_advisor_url']:\n",
+ " if field in restaurant:\n",
+ " restaurant.pop(field)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Hqu5erM0bBjc"
+ },
+ "source": [
+ "## Initialize Redis Provider + Vectorizer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "sHCkRr_2IOBK"
+ },
+ "outputs": [],
+ "source": [
+ "from agent_framework import ChatMessage, Role\n",
+ "from agent_framework.openai import OpenAIChatClient\n",
+ "from agent_framework_redis._chat_message_store import RedisChatMessageStore\n",
+ "from agent_framework_redis._provider import RedisProvider\n",
+ "from redisvl.extensions.cache.embeddings import EmbeddingsCache\n",
+ "from redisvl.utils.vectorize import OpenAITextVectorizer\n",
+ "from logging import WARNING, getLogger\n",
+ "from tqdm import tqdm\n",
+ "\n",
+ "logger = getLogger()\n",
+ "logger.setLevel(WARNING)\n",
+ "\n",
+ "REDIS_OPENAI_EMBEDDINGS_CACHE_NAME = os.getenv(\"REDIS_OPENAI_EMBEDDINGS_CACHE_NAME\",\n",
+ " \"openai_embeddings_cache\")\n",
+ "OPENAI_API_KEY=os.getenv(\"OPENAI_API_KEY\",\n",
+ " \"\")\n",
+ "OPENAI_CHAT_MODEL_ID=os.getenv(\"OPENAI_CHAT_MODEL_ID\",\n",
+ " \"gpt-5-mini\")\n",
+ "OPENAI_EMBEDDING_MODEL_ID=os.getenv(\"OPENAI_EMBEDDING_MODEL_ID\",\n",
+ " \"text-embedding-3-small\")\n",
+ "\n",
+ "thread_id=\"test_thread\"\n",
+ "\n",
+ "vectorizer = OpenAITextVectorizer(\n",
+ " model=OPENAI_EMBEDDING_MODEL_ID,\n",
+ " api_config={\"api_key\": OPENAI_API_KEY},\n",
+ " cache=EmbeddingsCache(name=REDIS_OPENAI_EMBEDDINGS_CACHE_NAME,\n",
+ " redis_url=REDIS_URL)\n",
+ ")\n",
+ "\n",
+ "provider = RedisProvider(\n",
+ " redis_url=REDIS_URL,\n",
+ " index_name=\"restaurant_reviews\",\n",
+ " prefix=\"trip_advisor\",\n",
+ " application_id=\"restaurant_reviews_app\",\n",
+ " agent_id=\"restaurant_reviews_agent\",\n",
+ " user_id=\"restaurant_reviews_user\",\n",
+ " redis_vectorizer=vectorizer,\n",
+ " vector_field_name=\"vector\",\n",
+ " vector_algorithm=\"hnsw\",\n",
+ " vector_distance_metric=\"cosine\",\n",
+ " thread_id=thread_id,\n",
+ " overwrite_index=True\n",
+ ")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MFqKQ3N8XG3u"
+ },
+ "source": [
+ "### Add Memories in batches to the Redis Memory provider"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "DXTkhG1AXFse"
+ },
+ "outputs": [],
+ "source": [
+ "batch_size=128\n",
+ "messages=[]\n",
+ "await provider.thread_created(thread_id=thread_id)\n",
+ "for restaurant in tqdm(restaurant_reviews):\n",
+ " # add each review to our agent memory\n",
+ " # for brevity we'll take only the first 10 reviews per restaurant\n",
+ " for review in restaurant['reviews'][:10]:\n",
+ " try:\n",
+ " review_title=review['review_title']\n",
+ " review_text=review[\"review_text\"]\n",
+ " meta_data=str(\"\\n\".join([str(key) + \": \" + str(val) for key, val in restaurant.items() if key != \"reviews\"]))\n",
+ " memory=\"\\n\".join([review_title, review_text, meta_data])\n",
+ " message = ChatMessage(role='system', conversation_id=thread_id, text=memory)\n",
+ " messages.append(message)\n",
+ " if len(messages)==batch_size:\n",
+ " await provider.invoked(request_messages=[message])\n",
+ " messages=[]\n",
+ " except Exception as e:\n",
+ " print(e)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "fO2OVM7lTQPS",
+ "outputId": "1d4200a4-83f2-4bd5-df12-04ef3968c0d5"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1118\n",
+ "This place is the best!\n",
+ "First let me start by saying I am a local who eats here at least once a week if not twice.I travel for a living and try a lot of different restaurants and Nani's is by far the bestCuban food I have ever eaten. Everything is fresh & just so full of flavor! My favorites are the Empanadas, Cuban sandwich, Crab Cakes and of course the black beans. When you go there, ask for Marie's homemade hot sauce & Mojo. Ray & Marie are the nicest & really make you feel at home.\n",
+ "name: Nanis Coffee\n",
+ "address: 2739 Geary Blvd\n",
+ "locality: San Francisco\n",
+ "latitude: 37.782187\n",
+ "longitude: -122.448613\n",
+ "cuisine: ['Coffee', 'Sandwiches', 'Cafe', 'Bagels', 'Tea']\n",
+ "price: 1\n",
+ "rating: 5.0\n",
+ "hours: {'monday': [['7:00', '17:30']], 'tuesday': [['7:00', '17:30']], 'wednesday': [['7:00', '17:30']], 'thursday': [['7:00', '17:30']], 'friday': [['7:00', '17:30']], 'saturday': [['8:30', '17:00']], 'sunday': [['8:30', '15:00']]}\n",
+ "parking: True\n",
+ "parking_valet: False\n",
+ "parking_garage: False\n",
+ "parking_street: True\n",
+ "parking_lot: False\n",
+ "parking_validated: False\n",
+ "parking_free: False\n",
+ "smoking: False\n",
+ "accessible_wheelchair: True\n",
+ "wifi: True\n",
+ "meal_breakfast: True\n",
+ "meal_deliver: True\n",
+ "meal_dinner: True\n",
+ "meal_lunch: True\n",
+ "meal_takeout: True\n",
+ "meal_cater: False\n",
+ "options_healthy: True\n",
+ "options_organic: False\n",
+ "options_vegetarian: True\n",
+ "options_vegan: False\n",
+ "options_glutenfree: False\n",
+ "options_lowfat: False\n"
+ ]
+ }
+ ],
+ "source": [
+ "all=await provider.search_all()\n",
+ "# Number of Reviews\n",
+ "print(len(all))\n",
+ "\n",
+ "# Sample Review\n",
+ "# print(all[100][\"content\"])\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "tiTIAnWWW9Dn"
+ },
+ "source": [
+ "### Initialize Agent with Provider and Chat Message Store"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "id": "JSc_Pg3QJmLQ"
+ },
+ "outputs": [],
+ "source": [
+ "chat_message_store_factory = lambda: RedisChatMessageStore(\n",
+ " redis_url=REDIS_URL,\n",
+ " thread_id=\"test_thread\",\n",
+ " key_prefix=\"chat_messages\",\n",
+ " max_messages=100\n",
+ ")\n",
+ "\n",
+ "client = OpenAIChatClient(model_id=OPENAI_CHAT_MODEL_ID,\n",
+ " api_key=OPENAI_API_KEY)\n",
+ "# Create agent wired to the Redis context provider. The provider automatically\n",
+ "# persists conversational details and surfaces relevant context on each turn.\n",
+ "review_agent = client.create_agent(\n",
+ " name=\"MemoryEnhancedAssistant\",\n",
+ " instructions=(\n",
+ " \"You are a helpful assistant. Personalize replies using provided context. \"\n",
+ " \"Before answering, always check for stored context\"\n",
+ " ),\n",
+ " tools=[summarize , get_keywords, publish_article],\n",
+ " context_providers=provider,\n",
+ " chat_message_store_factory=chat_message_store_factory,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "FKkMhtmGW3TZ"
+ },
+ "source": [
+ "### Teaching Preferences"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "eD1tTAVsWt3x",
+ "outputId": "e1593ef6-aecf-47e8-9a61-0b20ba161211"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Got it — I remember you hate beef. I’ll avoid recommending beef dishes and beef‑focused restaurants going forward.\n",
+ "\n",
+ "Would you like a beef‑free shortlist now? (Options: by neighborhood, by price tier, by cuisine, or for a special occasion.)\n"
+ ]
+ }
+ ],
+ "source": [
+ "preference = \"Remember that I hate beef\"\n",
+ "result = await review_agent.run(preference)\n",
+ "print(result)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "kjsFtIR0W5FO"
+ },
+ "source": [
+ "### Running a Streaming Task"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "-NlF9YQiL5n2",
+ "outputId": "5fd90ef2-2248-424f-9975-d6f52bfc7ce9"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "User: Write an article reviewing the restaurants in the San Francisco bay area. Include a brief summary of the most popular restaurants based on the user reviews. Group them into categories based on their cuisine and price, and talk about the top rated restaurants in each category.\n",
+ "Agent: Thanks — I remembered you hate beef, so this review highlights non‑beef options and avoids pushing steak/BBQ spots. Below is an article-style overview of the San Francisco Bay Area restaurant scene, a short summary of the most popular places based on user reviews (including a few from your saved visits), and a cuisine × price breakdown with the top-rated picks and what reviewers typically say about them.\n",
+ "\n",
+ "San Francisco Bay Area — a quick dining profile\n",
+ "The Bay Area mixes landmark institutions with inventive newcomers and excellent ethnic restaurants. Reviewers reward seasonality and ingredient quality at fine dining spots, authenticity at ethnic counters and taquerias, and value at neighborhood seafood, bakery and dim sum counters — all great if you avoid beef, since seafood, poultry, pork and plant‑forward cooking are widely celebrated.\n",
+ "\n",
+ "Brief summary — most popular restaurants (based on user reviews)\n",
+ "- Atelier Crenn (SF) — poetic, vegetable- and seafood-forward tasting menus.\n",
+ "- Benu (SF) — refined, Asian-influenced multi‑course meals (many seafood/veg courses).\n",
+ "- Quince (SF) — polished Californian/Italian tasting menu with fish and veg highlights.\n",
+ "- State Bird Provisions (SF) — inventive New American small plates (lots of seafood, poultry, vegetables).\n",
+ "- Chez Panisse (Berkeley) — farm-to-table pioneer; seasonal vegetable and seafood menus.\n",
+ "- La Taqueria (Mission) — Mission‑style tacos and burritos (choose pollo/carnitas/veg).\n",
+ "- Tartine Bakery (Mission) — legendary bakery for bread and pastries.\n",
+ "- Swan Oyster Depot (SF) — classic raw bar beloved for oysters, crab, cured fish.\n",
+ "- The Slanted Door (Ferry Building) — modern Vietnamese with many seafood/vegetable favorites.\n",
+ "- Yank Sing / Koi Palace — top dim sum destinations (many seafood & veg choices).\n",
+ "- From your saved visits: 21st Amendment Brewery (casual pub with unique beers), MarketBar (Ferry Building seafood/Californian), Pacific Cafe (rich local seafood; praised grilled fish), Anchor & Hope (seafood-forward), Pier Market Seafood (old-school seafood), B Star Cafe (fresh, healthy neighborhood spot).\n",
+ "\n",
+ "Grouped by cuisine and price (price tiers: $ = casual, $$ = moderate, $$$ = upscale, $$$$ = fine dining)\n",
+ "\n",
+ "Californian / New American\n",
+ "- $: Neighborhood cafés and market counters — seasonal salads, fish sandwiches, roasted chicken and veggie bowls are common and well-reviewed across neighborhoods.\n",
+ "- $$: State Bird Provisions (SF) — top rated for playful small plates; reviewers love the variety and many non‑beef options (seafood, poultry, veg).\n",
+ "- $$$–$$$$: Chez Panisse (Berkeley), Quince, Atelier Crenn — fine-dining tasting menu destinations. Reviewers praise ingredient quality, artistry and service; menus frequently emphasize fish and vegetables and can be adapted on request for no‑beef diners.\n",
+ "\n",
+ "Seafood & Raw Bar\n",
+ "- $: Ferry Building stalls (MarketBar, Hog Island Oyster Co.), casual counters — fresh, market-driven plates. MarketBar appears in your visits and is often recommended for clam chowder, seafood plates and light Bay‑front lunches.\n",
+ "- $$: Swan Oyster Depot — iconic counter with rave reviews for oysters, crab and smoked fish; expect a line but reviewers deem it worth the wait.\n",
+ "- $$–$$$: Anchor & Hope, Pier Market Seafood, Waterbar, Angler — reviewers call these reliable for fresh shellfish, grilled fish, and elevated seafood courses. Pacific Cafe (saved visit) is repeatedly praised for grilled fish and generous platters; reviewers note occasional price surprises but stellar freshness.\n",
+ "- Why reviewers like seafood spots: freshness, portion size, and classic preparations (raw bar, grilled whole fish, chowders).\n",
+ "\n",
+ "Italian\n",
+ "- $–$$: Neighborhood trattorias and pizzerias (Delfina, Cotogna) — reviewers appreciate handmade pastas and seafood or vegetable toppings as reliable non‑beef options.\n",
+ "- $$$–$$$$: Quince and some tasting-menu Italian offerings — lauded for refined technique and seasonal fish/veg courses.\n",
+ "\n",
+ "Japanese / Sushi / Omakase\n",
+ "- $: Ramen shops and casual sushi counters — many reviewers recommend ramen and seafood bowls as excellent, affordable options.\n",
+ "- $$–$$$: Ju‑Ni, Kusakabe and other omakase counters — top rated for fish quality, pacing and precision. Sushi/omakase are naturally excellent no‑beef choices; reviewers advise booking well in advance and noting dietary needs.\n",
+ "\n",
+ "Chinese / Dim Sum\n",
+ "- $: Chinatown noodle houses and casual spots — reviewers highlight authentic, low-cost seafood and vegetarian dishes.\n",
+ "- $$: Yank Sing (SF) and Koi Palace (Daly City/San Mateo) — highly rated for dim sum variety and consistent quality; easy to assemble a full meal without beef.\n",
+ "\n",
+ "Mexican & Latin\n",
+ "- $: Mission taquerias (La Taqueria, El Farolito) — reviewers love the flavors and value; simply choose pollo, carnitas, pescado or vegetarian fillings if you avoid beef.\n",
+ "- $$: Nopalito — traditional dishes done well, with solid non‑beef choices (seafood, chicken, veggie).\n",
+ "- $$$: Cala — contemporary coastal Mexican; reviewers praise sustainable seafood and creative vegetable preparations.\n",
+ "\n",
+ "Indian & South Asian\n",
+ "- $–$$: Dosa houses, casual curry spots and chaat counters — reviewers often single these out for outstanding vegetarian and seafood options.\n",
+ "- $$–$$$: Modern Indian tasting menus — many reviewers note inventive, multi-course non‑beef options.\n",
+ "\n",
+ "Vegetarian / Vegan / Plant‑forward\n",
+ "- $–$$: Cafés and lunch spots across the city offer excellent plant-forward bowls and sandwiches.\n",
+ "- $$$: Greens (Fort Mason) and Millennium (Oakland) — reviewers rate these highly for creative, satisfying vegetarian/vegan tasting experiences; great options if you avoid beef.\n",
+ "\n",
+ "Bakeries, Cafés & Casual Favorites\n",
+ "- Tartine Bakery, B. Patisserie, Bi‑Rite Creamery — reviewers consistently recommend them for pastries and sweets. From your saved places, MarketBar and B Star Cafe are often praised for light, fresh meals and healthy choices.\n",
+ "\n",
+ "Pubs & Breweries\n",
+ "- $$: 21st Amendment Brewery & Restaurant (saved visit) — reviewers and your memory note unique house beers, approachable pub food and a people‑watching atmosphere; good for a casual stop (pick seafood or vegetarian apps instead of beef burgers).\n",
+ "\n",
+ "Practical reviewer-backed tips (for a no‑beef diner)\n",
+ "- Book tasting menus and omakase early and mention “no beef” in the reservation; many high‑end kitchens will adapt.\n",
+ "- Expect lines at counters and bakeries (Tartine, Swan Oyster Depot) — reviewers advise arriving early or off‑peak.\n",
+ "- For budget, high-quality meals, pick taquerias (pollo/pescado/veg), dim sum counters, and seafood markets — reviewers repeatedly praise value and flavor here.\n",
+ "- Check recent reviews for menu changes and pricing — seafood spots can be price‑variable depending on market catches (some reviewers at Pacific Cafe and Anchor & Hope note high checks for seafood splurges).\n",
+ "\n",
+ "Bottom line — reviewer consensus\n",
+ "- For special occasions: Atelier Crenn, Quince, Benu and top omakase counters get the strongest praise for technique and service, and they offer abundant non‑beef courses.\n",
+ "- For memorable, authentic casual meals: La Taqueria, Swan Oyster Depot, Yank Sing / Koi Palace, Tartine and neighborhood seafood counters (MarketBar, Pier Market) are reviewer favorites.\n",
+ "- For plant-forward dining: Greens and Millennium stand out in reviews for satisfying no‑beef tasting experiences.\n",
+ "\n",
+ "Want this turned into a beef‑free short list?\n",
+ "I can produce a printable beef‑free top 10 by neighborhood (e.g., Mission, Ferry Building, North Beach, Berkeley) with recommended dishes and reservation tips. Which neighborhoods or price tiers should I focus on?\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "import asyncio\n",
+ "\n",
+ "async def streaming_example(agent, query) -> None:\n",
+ " print(f\"User: {query}\")\n",
+ " print(\"Agent: \", end=\"\", flush=True)\n",
+ " async for chunk in agent.run_stream(query):\n",
+ " if chunk.text:\n",
+ " print(chunk.text, end=\"\", flush=True)\n",
+ " print(\"\\n\")\n",
+ "\n",
+ "writing_task = \"Write an article reviewing the restaurants in the San Francisco bay area. \\\n",
+ " Include a brief summary of the most popular restaurants based on the user reviews. \\\n",
+ " Group them into categories based on their cuisine and price, and talk about the \\\n",
+ " top rated restaurants in each category.\"\n",
+ "\n",
+ "await streaming_example(review_agent, writing_task)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sA0d3smMWl9C"
+ },
+ "source": [
+ "That's a lot of output from our agent, and it can be hard to parse through all of it.\n",
+ "\n",
+ "There's no need for us to read it closely as we'll have the final article written to an external file cleanly when we're - or rather our agent - is finished."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MbeI2TouXNog"
+ },
+ "source": [
+ "## Follow up tasks\n",
+ "Our agent doesn't have to be a one-and-done worker. We can ask it to continue toward our overall goal of having a well viewed food critic article.\n",
+ "\n",
+ "You've probably noticed the agent's output is somewhat messy. That's ok as our final article will be written cleanly to a markdown file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "F0pGU--3MnLq",
+ "outputId": "29a4b7d9-f8fa-450e-80db-893ae143e522"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "User: Now analyze your article and tell me the key search terms it is likely to rank highly for.\n",
+ "Agent: I ran a keyword analysis on the article and refined the raw results. Below are the key search terms the article is likely to rank well for, grouped by priority and intent, plus a few quick SEO suggestions to improve ranking.\n",
+ "\n",
+ "Primary (high relevancy / local intent)\n",
+ "- San Francisco Bay Area restaurants\n",
+ "- San Francisco restaurants\n",
+ "- best restaurants San Francisco\n",
+ "- SF restaurants by cuisine\n",
+ "Why: article repeatedly uses these exact phrases, mentions neighborhoods and many SF restaurant names.\n",
+ "\n",
+ "Secondary (strong, content-backed niche terms)\n",
+ "- best seafood San Francisco\n",
+ "- San Francisco vegetarian restaurants / plant-forward San Francisco\n",
+ "- San Francisco tasting menu / SF tasting menu\n",
+ "- best omakase San Francisco\n",
+ "- best dim sum San Francisco\n",
+ "- Ferry Building restaurants San Francisco\n",
+ "Why: article emphasizes seafood, vegetarian/vegan, tasting menus, omakase and dim sum and references Ferry Building.\n",
+ "\n",
+ "Long-tail / specific queries (good for targeted traffic)\n",
+ "- best non-beef restaurants in San Francisco Bay Area\n",
+ "- San Francisco restaurants by cuisine and price\n",
+ "- top rated restaurants San Francisco based on user reviews\n",
+ "- best taqueria in Mission District (La Taqueria)\n",
+ "- where to eat in San Francisco without beef\n",
+ "- Bay Area seafood & raw bar guide\n",
+ "Why: the article explicitly positions itself as a review grouped by cuisine/price and with a non‑beef focus.\n",
+ "\n",
+ "Brand & destination names (high-value for local searches)\n",
+ "- Atelier Crenn, Quince, Benu, State Bird Provisions, Chez Panisse\n",
+ "- Tartine Bakery, Swan Oyster Depot, The Slanted Door, Yank Sing, Koi Palace\n",
+ "Why: named-entity searches (restaurant names) are likely to drive clicks when combined with review-type intent.\n",
+ "\n",
+ "Price/intent modifiers (help capture user search intent)\n",
+ "- cheap eats San Francisco, casual restaurants San Francisco ($)\n",
+ "- moderate restaurants SF ($$)\n",
+ "- fine dining San Francisco ($$$$)\n",
+ "- San Francisco restaurants for special occasions\n",
+ "Why: article organizes by price tiers and occasion.\n",
+ "\n",
+ "Keywords to avoid/negative modifiers (due to user preference / article focus)\n",
+ "- steakhouse San Francisco, best burgers SF, churrascaria San Francisco\n",
+ "Why: article purposely avoids beef/steakhouse focus — useful as negative keywords if running ads or filtering content.\n",
+ "\n",
+ "How the article’s content supports ranking\n",
+ "- Strong local intent: repeated city/region and neighborhood mentions (Mission, Ferry Building, Berkeley).\n",
+ "- Topical breadth: covers cuisine categories (seafood, Italian, Japanese/sushi, Mexican, dim sum, vegetarian) and price tiers — good for both informational and local searches.\n",
+ "- Named-entity density: multiple high-profile restaurant names that match common search queries.\n",
+ "\n",
+ "Quick SEO recommendations to boost ranking\n",
+ "- Use 1–2 of the primary keywords in the page title and front-loaded meta title (e.g., “San Francisco Bay Area Restaurants: Best Seafood, Vegetarian & Tasting Menus”).\n",
+ "- Add a meta description with a long-tail phrase like “beef‑free restaurant guide” or “restaurants by cuisine and price in San Francisco.”\n",
+ "- Add structured data (LocalBusiness, Restaurant) and clearly list neighborhoods, price tiers, and hours if available.\n",
+ "- Include a short FAQ section answering queries like “Where to find the best seafood in SF?”, “Which SF tasting menus avoid beef?”, and “Best taquerias in the Mission (no beef).”\n",
+ "- Add internal anchors/headings for each cuisine and price tier to capture featured snippet opportunities.\n",
+ "\n",
+ "If you want, I can:\n",
+ "- Produce a prioritized keyword list with estimated search volume / difficulty (needs live data).\n",
+ "- Suggest a meta title and description and a 2–3 paragraph intro optimized for a targeted keyword (e.g., “best non‑beef restaurants San Francisco”).\n",
+ "\n",
+ "User: Using your analysis suggest changes to the original article to improve keyword ranking.\n",
+ "Agent: Thanks — I’ll keep in mind you hate beef and keep recommendations beef‑free. Below are concrete, prioritized edits and additions you can make to the original article to improve keyword ranking (on‑page, technical, content and outreach), with specific sample text you can drop in.\n",
+ "\n",
+ "Priority actions (high impact, relatively low effort)\n",
+ "1) Front‑load primary keywords in title, H1 and first 100 words\n",
+ "- Suggested page title (meta title): San Francisco Bay Area Restaurants — Best Seafood, Vegetarian & Non‑Beef Guides\n",
+ "- Suggested H1 (page headline): San Francisco Bay Area Restaurants: Best Seafood, Vegetarian & Non‑Beef Options\n",
+ "- Update first paragraph to include a primary keyword and long‑tail: e.g., “The San Francisco Bay Area restaurants scene is rich with seafood, vegetarian and non‑beef dining options. This guide reviews top restaurants across neighborhoods, groups them by cuisine and price, and highlights the best non‑beef choices based on user reviews.”\n",
+ "\n",
+ "2) Add a clear table of contents with anchor links\n",
+ "- Helps featured snippets and dwell time. Include anchors for each major cuisine and price tier, plus neighborhood lists (Mission, Ferry Building, Berkeley, South Bay).\n",
+ "\n",
+ "3) Use descriptive H2/H3 headings that match search intent\n",
+ "- Examples:\n",
+ " - H2: Best Seafood Restaurants in San Francisco (by price)\n",
+ " - H2: Best Non‑Beef Restaurants in the Bay Area\n",
+ " - H2: Best Tasting Menus & Omakase (SF)\n",
+ " - H3 under seafood: $ (Casual) — Ferry Building & Oyster Bars\n",
+ " - H3 under neighborhoods: Mission District — Top Picks (La Taqueria, Tartine)\n",
+ "\n",
+ "4) Add concise mini‑profiles for each named restaurant (use memory data where available)\n",
+ "- Each mini‑profile should include: one-sentence summary, cuisine/price, top non‑beef dishes, address/neighborhood, typical price tier, one line from reviews.\n",
+ "- Example (use your memory entries):\n",
+ " - Dosa — 995 Valencia St, Mission, SF. Cuisine: Indian/Vegetarian. Price: $$. Rating: 4.0. Highlights: dosa varieties, vegetarian and vegan options, lunch & dinner service; wheelchair accessible. (This increases named-entity relevance and local search signals.)\n",
+ " - Anchor & Hope — 83 Minna St, SOMA, SF. Cuisine: Seafood/American. Price: $$$. Rating: 4.0. Highlights: seafood plates, grilled fish, casual waterfront vibe.\n",
+ "\n",
+ "Medium‑impact content improvements\n",
+ "5) Create neighborhood landing sections and lists\n",
+ "- Add short pages/sections for Mission, Ferry Building/Embarcadero, North Beach, Berkeley, South Bay with 6–10 recommended beef‑free places and one recommended dish per place. Searchers often query “[neighborhood] best restaurants” so this targets local intent.\n",
+ "\n",
+ "6) Add long‑tail keyword phrases naturally into content\n",
+ "- Sprinkle these phrases in headings and copy:\n",
+ " - “best non‑beef restaurants in San Francisco”\n",
+ " - “where to eat in SF without beef”\n",
+ " - “best seafood restaurants San Francisco”\n",
+ " - “plant‑based restaurants San Francisco”\n",
+ "- Keep usage natural; avoid stuffing.\n",
+ "\n",
+ "7) Add FAQ (FAQPage schema) with common search queries\n",
+ "- Sample Q/A to include:\n",
+ " - Q: Where are the best seafood restaurants in San Francisco? A: [short answer + 3 examples].\n",
+ " - Q: Which SF tasting menus are easy to adapt for no‑beef diners? A: Quince, Atelier Crenn, Benu — mention to request no‑beef in advance.\n",
+ " - Q: Best taqueria in the Mission without beef? A: La Taqueria (pollo/pescado/veg options).\n",
+ "- These can capture voice search and featured snippets.\n",
+ "\n",
+ "Technical and structured data (high impact)\n",
+ "8) Add Restaurant/LocalBusiness structured data and Review snippets\n",
+ "- Implement schema.org/Restaurant for the article’s named restaurants (address, geo, cuisine, priceRange, openingHours, aggregateRating). Use the memory data for Dosa and Anchor & Hope.\n",
+ "- Add FAQPage schema for the FAQs above.\n",
+ "\n",
+ "9) Improve meta description and URL\n",
+ "- Suggested meta description: “Your beef‑free guide to San Francisco Bay Area restaurants — best seafood, vegetarian, tasting menus and neighborhood picks grouped by cuisine and price, based on user reviews.”\n",
+ "- Suggested URL slug: /san-francisco-restaurants-non-beef-guide or /sf-restaurants-seafood-vegetarian\n",
+ "\n",
+ "On‑page UX and assets (medium impact)\n",
+ "10) Add images with keyworded alt text & captions\n",
+ "- Alt text examples:\n",
+ " - “Best seafood San Francisco — oysters at Swan Oyster Depot”\n",
+ " - “Non‑beef tasting menu at Atelier Crenn — San Francisco”\n",
+ "- Use images for neighborhoods, dishes, and interiors; compress for speed.\n",
+ "\n",
+ "11) Add internal links to related pages\n",
+ "- Link from the article to any neighborhood pages, restaurant-specific pages or blog posts (e.g., “See our Mission District dining guide”).\n",
+ "- Use descriptive anchor text (e.g., “best omakase San Francisco” linking to an omakase list).\n",
+ "\n",
+ "12) Add review snippets and user quotes\n",
+ "- Include short user-review quotes (with attribution/date) for key restaurants. This improves trust and can be marked up with review schema.\n",
+ "\n",
+ "Content strategy (ongoing / lower immediate effort but high cumulative impact)\n",
+ "13) Publish evergreen neighborhood guides and periodic updates\n",
+ "- Create separate posts for “Best seafood restaurants SF” or “Best non‑beef tasting menus SF” and link to main article. Update quarterly to keep freshness.\n",
+ "\n",
+ "14) Target backlinks and local citations\n",
+ "- Outreach to local tourism boards, SF neighborhood blogs, food influencers and directories. Get Google My Business listings linked for each restaurant mention.\n",
+ "\n",
+ "15) Add negative-keyword guidance if running ads\n",
+ "- If planning ads, add negative keywords such as “steakhouse”, “best burgers San Francisco”, “churrascaria” to avoid mismatch.\n",
+ "\n",
+ "SEO copy examples you can paste in\n",
+ "- Intro (first 2 sentences): “San Francisco Bay Area restaurants are famous for seafood, vegetarian and tasting‑menu experiences. This beef‑free guide reviews top restaurants by cuisine and price, highlights the best non‑beef dishes, and shows where locals go in each neighborhood.”\n",
+ "- Meta title: “San Francisco Bay Area Restaurants — Best Seafood & Non‑Beef Guides”\n",
+ "- Meta description: “The best beef‑free restaurants in San Francisco: seafood, vegetarian, omakase and tasting menus by neighborhood and price, compiled from user reviews.”\n",
+ "\n",
+ "Priority checklist (impact / effort)\n",
+ "- High impact / low effort: update title/H1/intro, add TOC, add FAQs, add a few mini‑profiles (use memory data), add meta description and URL slug.\n",
+ "- High impact / medium effort: add Restaurant schema for top 10 restaurants, add FAQ schema, add image alt tags, add neighborhood sections.\n",
+ "- Medium impact / medium effort: publish neighborhood landing pages, outreach for backlinks, add review snippets with schema.\n",
+ "- Lower immediacy: build separate posts for each cuisine, add detailed structured menus/hours for every restaurant.\n",
+ "\n",
+ "Tone & keyword guidance\n",
+ "- Use primary keywords naturally and vary with synonyms: SF restaurants, San Francisco restaurants, Bay Area restaurants, best seafood SF, best vegetarian SF, non‑beef restaurants SF.\n",
+ "- Avoid keyword stuffing; target 1–2 primary keywords per page and 3–5 strong secondary/long‑tail phrases naturally.\n",
+ "\n",
+ "Finally — sample FAQ entries to add (short)\n",
+ "- “Which San Francisco restaurants are best for seafood?” — short list + 2‑sentence reasons.\n",
+ "- “Can tasting menus in SF be adapted for no‑beef diets?” — short answer + call to action to request adaptations in reservations.\n",
+ "- “Where to find top dim sum in the Bay Area?” — short list + neighborhoods.\n",
+ "\n",
+ "If you want, I can:\n",
+ "- Produce a revised version of your original article with the title, headings, TOC, FAQ and 8 restaurant mini‑profiles (beef‑free emphasis) ready to publish.\n",
+ "- Generate the JSON‑LD schema snippets for Dosa and Anchor & Hope using the memory data you provided. Which would you like next?\n",
+ "\n",
+ "User: Based on your suggestions, edit and modify your article to improve SEO keyword ranking. Give a new list of top keywords\n",
+ "Agent: Updated, SEO‑optimized article (beef‑free) — San Francisco Bay Area Restaurants\n",
+ "\n",
+ "Meta title:\n",
+ "San Francisco Bay Area Restaurants — Best Seafood, Vegetarian & Non‑Beef Guide\n",
+ "\n",
+ "Meta description:\n",
+ "A beef‑free guide to the best San Francisco Bay Area restaurants by cuisine and price. Top seafood, vegetarian, tasting menus, omakase and neighborhood picks based on user reviews.\n",
+ "\n",
+ "URL slug suggestion:\n",
+ "/san-francisco-restaurants-non-beef-guide\n",
+ "\n",
+ "Page headline (H1):\n",
+ "San Francisco Bay Area Restaurants: Best Seafood, Vegetarian & Non‑Beef Options (by Cuisine & Price)\n",
+ "\n",
+ "Table of contents (anchors)\n",
+ "1. Quick overview\n",
+ "2. Brief summary — most popular restaurants (non‑beef focus)\n",
+ "3. Restaurants grouped by cuisine & price\n",
+ " - Californian / New American\n",
+ " - Seafood & Raw Bar\n",
+ " - Italian\n",
+ " - Japanese / Sushi / Omakase\n",
+ " - Chinese / Dim Sum\n",
+ " - Mexican & Latin\n",
+ " - Indian & South Asian\n",
+ " - Vegetarian / Vegan / Plant‑forward\n",
+ " - Bakeries, Cafés & Casual Favorites\n",
+ "4. Neighborhood highlights\n",
+ "5. Mini‑profiles: top recommended beef‑free spots\n",
+ "6. Practical tips (booking & ordering)\n",
+ "7. FAQ\n",
+ "8. Call to action\n",
+ "\n",
+ "1) Quick overview\n",
+ "San Francisco Bay Area restaurants are celebrated for seafood, vegetable‑forward cooking, and diverse ethnic cuisines. This beef‑free guide reviews top restaurants by cuisine and price, highlights the best non‑beef dishes, and points you to neighborhood favorites backed by user reviews.\n",
+ "\n",
+ "2) Brief summary — most popular restaurants (non‑beef focus)\n",
+ "- Atelier Crenn (SF) — poetic tasting menus emphasizing seafood and vegetables.\n",
+ "- Benu (SF) — refined Asian‑influenced multi‑course menus with seafood/veg highlights.\n",
+ "- Quince (SF) — polished California‑Italian tasting menu featuring fish and seasonal produce.\n",
+ "- State Bird Provisions (SF) — inventive small plates, many seafood and vegetable options.\n",
+ "- Chez Panisse (Berkeley) — farm‑to‑table pioneer; seasonal, veg/seafood‑forward dinners.\n",
+ "- La Taqueria (Mission) — top Mission taqueria (choose pollo, pescado or vegetarian).\n",
+ "- Tartine Bakery (Mission) — world‑famous bakery for bread and pastries.\n",
+ "- Swan Oyster Depot (SF) — iconic raw bar for oysters, crab, smoked fish.\n",
+ "- Yank Sing / Koi Palace — top dim sum destinations with abundant seafood & veg choices.\n",
+ "\n",
+ "3) Restaurants grouped by cuisine & price\n",
+ "(Price tiers: $ = casual, $$ = moderate, $$$ = upscale, $$$$ = fine dining)\n",
+ "\n",
+ "Californian / New American\n",
+ "- $: Neighborhood cafés & market counters — seasonal salads, fish sandwiches, roasted chicken and bowls.\n",
+ "- $$: State Bird Provisions — lively small plates with many poultry, seafood and vegetable dishes.\n",
+ "- $$$–$$$$: Chez Panisse, Quince, Atelier Crenn — tasting menus that are adaptable for no‑beef diners; reviewers emphasize ingredient quality and creative veg/seafood courses.\n",
+ "\n",
+ "Seafood & Raw Bar\n",
+ "- $: Ferry Building stalls (Hog Island, MarketBar) and casual oyster bars.\n",
+ "- $$: Swan Oyster Depot — counter service with top‑rated raw oysters and shellfish.\n",
+ "- $$$: Waterbar, Angler, Anchor & Hope — elevated seafood with excellent reviews for freshness and presentation.\n",
+ "\n",
+ "Italian\n",
+ "- $–$$: Neighborhood trattorias and pizzerias (Delfina, Cotogna) — reliable seafood pastas and vegetable antipasti.\n",
+ "- $$$–$$$$: Quince and upscale Italian tasting menus — seasonal fish and veg courses, highly rated.\n",
+ "\n",
+ "Japanese / Sushi / Omakase\n",
+ "- $: Ramen shops and casual sushi counters — many reviewers recommend seafood bowls and vegetarian ramen.\n",
+ "- $$–$$$: Ju‑Ni, Kusakabe and similar omakase counters — premium fish‑first tasting experiences; naturally beef‑free.\n",
+ "\n",
+ "Chinese / Dim Sum\n",
+ "- $: Chinatown noodle houses and casual spots — many seafood and vegetarian dishes.\n",
+ "- $$: Yank Sing (SF) and Koi Palace — acclaimed dim sum with extensive seafood/veg options.\n",
+ "\n",
+ "Mexican & Latin\n",
+ "- $: Mission taquerias (La Taqueria, El Farolito) — choose pollo, carnitas, pescado or vegetarian fillings.\n",
+ "- $$: Nopalito — traditional Mexican with house‑made tortillas and seafood/chicken options.\n",
+ "- $$$: Cala — contemporary coastal Mexican known for sustainable seafood plates.\n",
+ "\n",
+ "Indian & South Asian\n",
+ "- $–$$: Dosa houses and casual curry spots — strong vegetarian and seafood offerings.\n",
+ "- $$–$$$: Modern Indian tasting menus — often include multiple non‑beef choices.\n",
+ "\n",
+ "Vegetarian / Vegan / Plant‑forward\n",
+ "- $–$$: Cafés and plant‑forward lunch spots across SF.\n",
+ "- $$$: Greens (Fort Mason) and Millennium (Oakland) — top-rated vegan/vegetarian tasting‑menu experiences.\n",
+ "\n",
+ "Bakeries, Cafés & Casual Favorites\n",
+ "- Tartine Bakery, B. Patisserie, Bi‑Rite Creamery — top user‑reviewed bakeries and dessert stops (all beef‑free).\n",
+ "\n",
+ "4) Neighborhood highlights (short)\n",
+ "- Mission District: La Taqueria (pollo/pescado/veg), Tartine Bakery — casual to iconic.\n",
+ "- Ferry Building / Embarcadero: The Slanted Door, MarketBar, Hog Island Oyster Co. — market‑fresh seafood and waterfront views.\n",
+ "- North Beach: Italian trattorias and cafés — many seafood/veg pasta options.\n",
+ "- Berkeley: Chez Panisse and farm‑to‑table clusters.\n",
+ "- South Bay / Peninsula: Excellent dim sum, Indian, and diverse immigrant‑driven restaurants.\n",
+ "\n",
+ "5) Mini‑profiles: top recommended beef‑free spots (drop‑in snippets to add schema/local signals)\n",
+ "- Atelier Crenn — Cuisine: Californian/Fine dining. Price: $$$$.\n",
+ " Top non‑beef dishes: multi‑course seafood & vegetable tasting menu. Neighborhood: Cow Hollow/Marina. Review snapshot: praised for artistry and veg/seafood creativity.\n",
+ "\n",
+ "- Quince — Cuisine: Californian/Italian. Price: $$$$.\n",
+ " Top non‑beef dishes: seasonal seafood courses, refined vegetable preparations. Neighborhood: Jackson Square. Review snapshot: polished service and wine program.\n",
+ "\n",
+ "- Benu — Cuisine: Contemporary Asian tasting menu. Price: $$$$.\n",
+ " Top non‑beef dishes: seafood-forward multi‑course menus. Neighborhood: SoMa. Review snapshot: precise technique and memorable seafood courses.\n",
+ "\n",
+ "- State Bird Provisions — Cuisine: New American/small plates. Price: $$.\n",
+ " Top non‑beef dishes: seasonal seafood plates, poultry and veg small plates. Neighborhood: Hayes Valley. Review snapshot: playful service and variety.\n",
+ "\n",
+ "- Chez Panisse — Cuisine: Farm‑to‑table Californian. Price: $$$.\n",
+ " Top non‑beef dishes: vegetable‑centric prix fixe; seasonal fish features. Neighborhood: Berkeley. Review snapshot: pioneering seasonal cuisine.\n",
+ "\n",
+ "- La Taqueria — Cuisine: Mexican/Taqueria. Price: $.\n",
+ " Top non‑beef dishes: pollo tacos, pescado tacos, vegetarian burritos. Neighborhood: Mission. Review snapshot: locals rave about flavor and value.\n",
+ "\n",
+ "- Tartine Bakery — Cuisine: Bakery / café. Price: $.\n",
+ " Top non‑beef dishes: sourdough, morning buns, pastries. Neighborhood: Mission. Review snapshot: legendary bread, expect lines.\n",
+ "\n",
+ "- Swan Oyster Depot — Cuisine: Seafood / raw bar. Price: $$.\n",
+ " Top non‑beef dishes: raw oysters, Dungeness crab, smoked fish. Neighborhood: Polk St / Russian Hill. Review snapshot: iconic counter, fresh seafood, long lines worth it.\n",
+ "\n",
+ "(You can convert each mini‑profile into a small restaurant page with schema.org/Restaurant markup for local SEO.)\n",
+ "\n",
+ "6) Practical tips (booking & ordering) — reviewer‑backed\n",
+ "- Always note “no beef” when reserving tasting menus or omakase; many high‑end kitchens will accommodate.\n",
+ "- For counters and bakeries, go early or off‑peak to avoid long lines (Tartine, Swan Oyster Depot).\n",
+ "- At taquerias, dim sum and market stalls, build a beef‑free meal by mixing poultry, pork, seafood and veg items.\n",
+ "- Check recent reviews for price changes — seafood dishes vary with market rates.\n",
+ "\n",
+ "7) FAQ (add FAQPage schema on page)\n",
+ "Q: Where are the best seafood restaurants in San Francisco?\n",
+ "A: Ferry Building stalls (Hog Island, MarketBar), Swan Oyster Depot, Waterbar and Angler are top picks for fresh shellfish, grilled fish and raw bars.\n",
+ "\n",
+ "Q: Can San Francisco tasting menus be adapted for no‑beef diners?\n",
+ "A: Yes — Quince, Atelier Crenn and Benu typically accommodate dietary notes if you state “no beef” when booking.\n",
+ "\n",
+ "Q: Which places are best for dim sum without beef?\n",
+ "A: Yank Sing and Koi Palace offer extensive seafood, pork and vegetable dim sum options, making it easy to avoid beef.\n",
+ "\n",
+ "8) Call to action\n",
+ "Want a printable beef‑free top 10 by neighborhood or a downloadable PDF with recommended dishes and reservation tips? Tell me which neighborhood(s) or price range you want prioritized.\n",
+ "\n",
+ "New prioritized keyword list (optimized for this revised article)\n",
+ "Primary (highest priority — target in title, H1, intro, and meta)\n",
+ "- san francisco bay area restaurants\n",
+ "- san francisco restaurants\n",
+ "- best restaurants san francisco\n",
+ "- best non‑beef restaurants san francisco\n",
+ "\n",
+ "Secondary (strong intent, include in H2/H3s and mini‑profiles)\n",
+ "- best seafood san francisco\n",
+ "- san francisco vegetarian restaurants\n",
+ "- best tasting menu san francisco\n",
+ "- best omakase san francisco\n",
+ "- best dim sum san francisco\n",
+ "- ferry building restaurants san francisco\n",
+ "\n",
+ "Long‑tail / niche (use in FAQ, neighborhood sections and anchors)\n",
+ "- best non‑beef restaurants in san francisco bay area\n",
+ "- where to eat in san francisco without beef\n",
+ "- best taqueria in the mission (no beef)\n",
+ "- bay area seafood & raw bar guide\n",
+ "- plant‑based restaurants san francisco\n",
+ "- san francisco restaurants by cuisine and price\n",
+ "\n",
+ "Local / brand (use in mini‑profiles, internal links and schema)\n",
+ "- Atelier Crenn, Quince, Benu, State Bird Provisions, Chez Panisse\n",
+ "- Tartine Bakery, Swan Oyster Depot, The Slanted Door, Yank Sing, Koi Palace\n",
+ "\n",
+ "Negative / ad filters (use as negative keywords if running ads)\n",
+ "- steakhouse san francisco, best burgers sf, churrascaria san francisco\n",
+ "\n",
+ "Quick on‑page implementation checklist (highest priority)\n",
+ "- Apply meta title, meta description, and URL slug above.\n",
+ "- Use the H1 and TOC; add internal anchor links for each section.\n",
+ "- Insert the mini‑profiles (with addresses/hours if you have them) and mark up top restaurants with Restaurant schema.\n",
+ "- Add FAQ and FAQPage schema.\n",
+ "- Add 2–4 relevant images with alt text such as “best seafood San Francisco — oysters at Swan Oyster Depot” and compress for page speed.\n",
+ "- Add internal links to neighborhood pages or other relevant content.\n",
+ "\n",
+ "If you want, I’ll:\n",
+ "- Produce the article as a ready‑to‑publish HTML or markdown file with schema (Restaurant + FAQ) and image alt text.\n",
+ "- Generate JSON‑LD snippets for 8 restaurants (including Dosa and Anchor & Hope) for direct insertion. Which would you like next?\n",
+ "\n",
+ "User: When it is ready, publish the article by saving it to a markdown file.\n",
+ "Agent: Sorry — I tried to save the article to a markdown file but an internal publish error occurred. The article itself is ready (beef‑free as requested). You can either have me retry publishing, tell me a specific file name/path to use, or copy the markdown below and save it locally. Which would you prefer?\n",
+ "\n",
+ "If you want me to retry publishing, please confirm the file name you want (or say “use san-francisco-restaurants-non-beef-guide.md”), and I’ll attempt again.\n",
+ "\n",
+ "Below is the full markdown content prepared for saving:\n",
+ "\n",
+ "---\n",
+ "meta_title: \"San Francisco Bay Area Restaurants — Best Seafood, Vegetarian & Non‑Beef Guide\"\n",
+ "meta_description: \"A beef‑free guide to the best San Francisco Bay Area restaurants by cuisine and price. Top seafood, vegetarian, tasting menus, omakase and neighborhood picks based on user reviews.\"\n",
+ "---\n",
+ "\n",
+ "# San Francisco Bay Area Restaurants: Best Seafood, Vegetarian & Non‑Beef Options (by Cuisine & Price)\n",
+ "\n",
+ "## Table of contents\n",
+ "1. Quick overview\n",
+ "2. Brief summary — most popular restaurants (non‑beef focus)\n",
+ "3. Restaurants grouped by cuisine & price\n",
+ " - Californian / New American\n",
+ " - Seafood & Raw Bar\n",
+ " - Italian\n",
+ " - Japanese / Sushi / Omakase\n",
+ " - Chinese / Dim Sum\n",
+ " - Mexican & Latin\n",
+ " - Indian & South Asian\n",
+ " - Vegetarian / Vegan / Plant‑forward\n",
+ " - Bakeries, Cafés & Casual Favorites\n",
+ "4. Neighborhood highlights\n",
+ "5. Mini‑profiles: top recommended beef‑free spots\n",
+ "6. Practical tips (booking & ordering)\n",
+ "7. FAQ\n",
+ "8. Call to action\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 1) Quick overview\n",
+ "San Francisco Bay Area restaurants are celebrated for seafood, vegetable‑forward cooking, and diverse ethnic cuisines. This beef‑free guide reviews top restaurants by cuisine and price, highlights the best non‑beef dishes, and points you to neighborhood favorites backed by user reviews.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 2) Brief summary — most popular restaurants (non‑beef focus)\n",
+ "- Atelier Crenn (SF) — poetic tasting menus emphasizing seafood and vegetables.\n",
+ "- Benu (SF) — refined Asian‑influenced multi‑course menus with seafood/veg highlights.\n",
+ "- Quince (SF) — polished California‑Italian tasting menu featuring fish and seasonal produce.\n",
+ "- State Bird Provisions (SF) — inventive small plates, many seafood and vegetable options.\n",
+ "- Chez Panisse (Berkeley) — farm‑to‑table pioneer; seasonal, veg/seafood‑forward dinners.\n",
+ "- La Taqueria (Mission) — top Mission taqueria (choose pollo, pescado or vegetarian).\n",
+ "- Tartine Bakery (Mission) — world‑famous bakery for bread and pastries.\n",
+ "- Swan Oyster Depot (SF) — iconic raw bar for oysters, crab, smoked fish.\n",
+ "- Yank Sing / Koi Palace — top dim sum destinations with abundant seafood & veg choices.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 3) Restaurants grouped by cuisine & price\n",
+ "(Price tiers: $ = casual, $$ = moderate, $$$ = upscale, $$$$ = fine dining)\n",
+ "\n",
+ "### Californian / New American\n",
+ "- $: Neighborhood cafés & market counters — seasonal salads, fish sandwiches, roasted chicken and bowls.\n",
+ "- $$: State Bird Provisions — lively small plates with many poultry, seafood and vegetable dishes.\n",
+ "- $$$–$$$$: Chez Panisse, Quince, Atelier Crenn — tasting menus that are adaptable for no‑beef diners; reviewers emphasize ingredient quality and creative veg/seafood courses.\n",
+ "\n",
+ "### Seafood & Raw Bar\n",
+ "- $: Ferry Building stalls (Hog Island, MarketBar) and casual oyster bars.\n",
+ "- $$: Swan Oyster Depot — counter service with top‑rated raw oysters and shellfish.\n",
+ "- $$$: Waterbar, Angler, Anchor & Hope — elevated seafood with excellent reviews for freshness and presentation.\n",
+ "\n",
+ "Why reviewers like seafood spots: freshness, variety of shellfish, and seafood‑forward tasting courses — ideal for avoiding beef.\n",
+ "\n",
+ "### Italian\n",
+ "- $–$$: Neighborhood trattorias and pizzerias (Delfina, Cotogna) — reliable seafood pastas and vegetable antipasti.\n",
+ "- $$$–$$$$: Quince and upscale Italian tasting menus — seasonal fish and veg courses, highly rated.\n",
+ "\n",
+ "### Japanese / Sushi / Omakase\n",
+ "- $: Ramen shops and casual sushi counters — many reviewers recommend seafood bowls and vegetarian ramen.\n",
+ "- $$–$$$: Ju‑Ni, Kusakabe and similar omakase counters — premium fish‑first tasting experiences; naturally beef‑free.\n",
+ "\n",
+ "### Chinese / Dim Sum\n",
+ "- $: Chinatown noodle houses and casual spots — many seafood and vegetarian dishes.\n",
+ "- $$: Yank Sing (SF) and Koi Palace — acclaimed dim sum with extensive seafood/veg options.\n",
+ "\n",
+ "### Mexican & Latin\n",
+ "- $: Mission taquerias (La Taqueria, El Farolito) — choose pollo, carnitas, pescado or vegetarian fillings.\n",
+ "- $$: Nopalito — traditional Mexican with house‑made tortillas and seafood/chicken options.\n",
+ "- $$$: Cala — contemporary coastal Mexican known for sustainable seafood plates.\n",
+ "\n",
+ "### Indian & South Asian\n",
+ "- $–$$: Dosa houses and casual curry spots — strong vegetarian and seafood offerings.\n",
+ "- $$–$$$: Modern Indian tasting menus — often include multiple non‑beef choices.\n",
+ "\n",
+ "### Vegetarian / Vegan / Plant‑forward\n",
+ "- $–$$: Cafés and plant‑forward lunch spots across SF.\n",
+ "- $$$: Greens (Fort Mason) and Millennium (Oakland) — top‑rated vegan/vegetarian tasting‑menu experiences.\n",
+ "\n",
+ "Why reviewers like them: thoughtful, seasonal plant‑forward menus ideal for beef‑averse diners.\n",
+ "\n",
+ "### Bakeries, Cafés & Casual Favorites\n",
+ "- Tartine Bakery, B. Patisserie, Bi‑Rite Creamery — top user‑reviewed bakeries and dessert stops (all beef‑free).\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 4) Neighborhood highlights (short)\n",
+ "- Mission District: La Taqueria (pollo/pescado/veg), Tartine Bakery — casual to iconic.\n",
+ "- Ferry Building / Embarcadero: The Slanted Door, MarketBar, Hog Island Oyster Co. — market‑fresh seafood and waterfront views.\n",
+ "- North Beach: Italian trattorias and cafés — many seafood/veg pasta options.\n",
+ "- Berkeley: Chez Panisse and farm‑to‑table clusters.\n",
+ "- South Bay / Peninsula: Excellent dim sum, Indian, and diverse immigrant‑driven restaurants.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 5) Mini‑profiles: top recommended beef‑free spots\n",
+ "(Use these as short snippets or convert to restaurant pages with schema.org/Restaurant markup.)\n",
+ "\n",
+ "### Atelier Crenn\n",
+ "- Cuisine: Californian / Fine dining\n",
+ "- Price: $$$$\n",
+ "- Top non‑beef dishes: multi‑course seafood & vegetable tasting menu\n",
+ "- Neighborhood: Cow Hollow / Marina\n",
+ "- Review snapshot: praised for artistry and veg/seafood creativity.\n",
+ "\n",
+ "### Quince\n",
+ "- Cuisine: Californian / Italian\n",
+ "- Price: $$$$\n",
+ "- Top non‑beef dishes: seasonal seafood courses, refined vegetable preparations\n",
+ "- Neighborhood: Jackson Square\n",
+ "- Review snapshot: polished service and wine program.\n",
+ "\n",
+ "### Benu\n",
+ "- Cuisine: Contemporary Asian tasting menu\n",
+ "- Price: $$$$\n",
+ "- Top non‑beef dishes: seafood‑forward multi‑course menus\n",
+ "- Neighborhood: SoMa\n",
+ "- Review snapshot: precise technique and memorable seafood courses.\n",
+ "\n",
+ "### State Bird Provisions\n",
+ "- Cuisine: New American / Small plates\n",
+ "- Price: $$\n",
+ "- Top non‑beef dishes: seasonal seafood plates, poultry and veg small plates\n",
+ "- Neighborhood: Hayes Valley\n",
+ "- Review snapshot: playful service and variety.\n",
+ "\n",
+ "### Chez Panisse\n",
+ "- Cuisine: Farm‑to‑table Californian\n",
+ "- Price: $$$\n",
+ "- Top non‑beef dishes: vegetable‑centric prix fixe; seasonal fish features\n",
+ "- Neighborhood: Berkeley\n",
+ "- Review snapshot: pioneering seasonal cuisine.\n",
+ "\n",
+ "### La Taqueria\n",
+ "- Cuisine: Mexican / Taqueria\n",
+ "- Price: $\n",
+ "- Top non‑beef dishes: pollo tacos, pescado tacos, vegetarian burritos\n",
+ "- Neighborhood: Mission\n",
+ "- Review snapshot: locals rave about flavor and value.\n",
+ "\n",
+ "### Tartine Bakery\n",
+ "- Cuisine: Bakery / Café\n",
+ "- Price: $\n",
+ "- Top non‑beef dishes: sourdough, morning buns, pastries\n",
+ "- Neighborhood: Mission\n",
+ "- Review snapshot: legendary bread; expect lines.\n",
+ "\n",
+ "### Swan Oyster Depot\n",
+ "- Cuisine: Seafood / Raw bar\n",
+ "- Price: $$\n",
+ "- Top non‑beef dishes: raw oysters, Dungeness crab, smoked fish\n",
+ "- Neighborhood: Polk St / Russian Hill\n",
+ "- Review snapshot: iconic counter, fresh seafood, long lines worth it.\n",
+ "\n",
+ "(Consider adding addresses, hours and rating snippets for each mini‑profile to improve local SEO.)\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 6) Practical tips (booking & ordering) — reviewer‑backed\n",
+ "- Always note “no beef” when reserving tasting menus or omakase; many high‑end kitchens will accommodate.\n",
+ "- For counters and bakeries, go early or off‑peak to avoid long lines (Tartine, Swan Oyster Depot).\n",
+ "- At taquerias, dim sum and market stalls, build a beef‑free meal by mixing poultry, pork, seafood and veg items.\n",
+ "- Check recent reviews for price changes — seafood dishes vary with market rates.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 7) FAQ\n",
+ "**Q: Where are the best seafood restaurants in San Francisco?**\n",
+ "A: Ferry Building stalls (Hog Island, MarketBar), Swan Oyster Depot, Waterbar and Angler are top picks for fresh shellfish, grilled fish and raw bars.\n",
+ "\n",
+ "**Q: Can San Francisco tasting menus be adapted for no‑beef diners?**\n",
+ "A: Yes — Quince, Atelier Crenn and Benu typically accommodate dietary notes if you state “no beef” when booking.\n",
+ "\n",
+ "**Q: Which places are best for dim sum without beef?**\n",
+ "A: Yank Sing and Koi Palace offer extensive seafood, pork and vegetable dim sum options, making it easy to avoid beef.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## 8) Call to action\n",
+ "Want a printable beef‑free top 10 by neighborhood or a downloadable PDF with recommended dishes and reservation tips? Tell me which neighborhood(s) or price range you want prioritized and I’ll prepare it.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "## New prioritized keyword list (optimized for this article)\n",
+ "**Primary (highest priority)**\n",
+ "- san francisco bay area restaurants\n",
+ "- san francisco restaurants\n",
+ "- best restaurants san francisco\n",
+ "- best non‑beef restaurants san francisco\n",
+ "\n",
+ "**Secondary**\n",
+ "- best seafood san francisco\n",
+ "- san francisco vegetarian restaurants\n",
+ "- best tasting menu san francisco\n",
+ "- best omakase san francisco\n",
+ "- best dim sum san francisco\n",
+ "- ferry building restaurants san francisco\n",
+ "\n",
+ "**Long‑tail / niche**\n",
+ "- best non‑beef restaurants in san francisco bay area\n",
+ "- where to eat in san francisco without beef\n",
+ "- best taqueria in the mission (no beef)\n",
+ "- bay area seafood & raw bar guide\n",
+ "- plant‑based restaurants san francisco\n",
+ "- san francisco restaurants by cuisine and price\n",
+ "\n",
+ "**Local / brand**\n",
+ "- Atelier Crenn, Quince, Benu, State Bird Provisions, Chez Panisse\n",
+ "- Tartine Bakery, Swan Oyster Depot, The Slanted Door, Yank Sing, Koi Palace\n",
+ "\n",
+ "**Negative / ad filters**\n",
+ "- steakhouse san francisco, best burgers sf, churrascaria san francisco\n",
+ "\n",
+ "---\n",
+ "\n",
+ "*Article compiled from user reviews and local recommendations. All suggestions avoid beef-heavy options per user preference.*\n",
+ "\n",
+ "---\n",
+ "\n",
+ "Would you like me to:\n",
+ "- Try publishing again now using the suggested filename san-francisco-restaurants-non-beef-guide.md?\n",
+ "- Save under a different filename you provide?\n",
+ "- Convert this to HTML or an attachment for download?\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "task_list = [\"Now analyze your article and tell me the key search terms it is likely to rank highly for.\",\n",
+ " \"Using your analysis suggest changes to the original article to improve keyword ranking.\",\n",
+ " \"Based on your suggestions, edit and modify your article to improve SEO keyword ranking. Give a new list of top keywords\",\n",
+ " \"When it is ready, publish the article by saving it to a markdown file.\"]\n",
+ "\n",
+ "for task in task_list:\n",
+ " await streaming_example(review_agent, task)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "RpLtRTmlXSWr"
+ },
+ "source": [
+ "## The finished product\n",
+ "We got another large block of agent output showing us it's hard work. What we really care about it is the finished product. Check your local directory for a markdown file with our finished article.\n",
+ "\n",
+ "That's it!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "HcPsZZcBabuv"
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}