Anthropic Claude Opus 4.6 и Gemini 3.1 на Vertex AI с использованием Python SDK через конечную точку Private Service Connect.

1. Обзор

Доступ к API Vertex AI возможен через интернет , однако в вашей организации может потребоваться частный доступ к API Vertex AI без использования интернета. В этой лабораторной работе вы сначала получите доступ к Anthropic Claude Opus 4.6 и Gemini 3.1Pro на Vertex через Python SDK, работающий на виртуальной машине через общедоступный интернет.

Затем вам нужно будет создать конечную точку Private Service Connect для подключения к Google API и изменить поток трафика, чтобы использовать эту частную конечную точку для подключения к API Vertex.

Приведенный пример кода на Python будет принимать на вход вопросы, передавать их в Claude Opus для генерации ответа , а полученный результат будет передан в Gemini 3 для создания текстового резюме и генерации изображения.

В этой лабораторной работе вы создадите следующий узор.

Рисунок 1.

c8f37e193349bfd6.png

2. Цели

В этой лабораторной работе вы научитесь выполнять следующее задание:

  • Настройте экземпляр виртуальной машины для использования SDK Python.
  • Включить карту антропической модели в Vertex AI
  • Подключение к Anthropic Claude Opus 4.6 и Gemini 3.1 Pro с помощью скрипта Python.
  • Настройте конечную точку PSC для подключения к Googleapis.
  • Настройка записей DNS вручную
  • Проверьте путь подключения к Googleais
  • Выполните скрипт Python для запроса моделей.

Настройка лаборатории

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

Активировать Cloud Shell

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

Скриншот терминала Google Cloud Shell, показывающий, что среда подключена.

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.

3. Настройка среды

Мы создадим пользовательскую VPC с правилами брандмауэра. Если у вас уже есть VPC и проект, вы можете пропустить этот шаг.

Откройте Cloud Shell, расположенный в верхней части консоли справа. И выполните следующие настройки: b51b80043d3bac90.png

  1. Включите некоторые из API, которые мы будем использовать в этой лабораторной работе.
gcloud services enable dns.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable servicedirectory.googleapis.com
  1. Задайте несколько переменных. Этими переменными являются идентификатор проекта и идентификатор сети пользовательской VPC (вы создадите VPC на шаге 4).
projectid=$(gcloud config get-value project)
networkid=anthropic-net 
echo $projectid
echo $networkid
  1. Теперь создайте пользовательскую VPC (anthropic-net), подсеть (vm1-subnet) и правила брандмауэра.
gcloud compute networks create $networkid \
--project=$projectid \
--subnet-mode=custom \
--mtu=1460 \
--bgp-routing-mode=global

gcloud compute networks subnets create vm-subnet \
--project=$projectid --range=10.0.88.0/24 \
--stack-type=IPV4_ONLY --network=$networkid \
--region=us-east1

gcloud compute firewall-rules create $networkid-allow-icmp --project=$projectid \
--network=$networkid \
--description="Allows ICMP connections from any source to any instance on the network." \
--direction=INGRESS \
--priority=65534 \
--source-ranges=0.0.0.0/0 \
--action=ALLOW \
--rules=icmp

gcloud compute firewall-rules create $networkid-allow-ssh \
--project=$projectid \
--network=$networkid \
--description="Allows TCP connections from any source to any instance on the network using port 22." \
--direction=INGRESS --priority=65534 \
--source-ranges=0.0.0.0/0 --action=ALLOW \
--rules=tcp:22

gcloud compute firewall-rules create $networkid-allow-web \
--project=$projectid \
--network=$networkid \
--description="Allows TCP connections on port 8080." \
--direction=INGRESS --priority=1000 \
--source-ranges=0.0.0.0/0 --action=ALLOW \
--rules=tcp:8080

4. Включите антропогенное воздействие в модели сада Vertex.

Нам необходимо разрешить исходящий внешний доступ к интернету, поэтому давайте создадим шлюз Cloud NAT и подключим его.

  1. Перейдите на панель управления Vertex AI и выберите «Модельный сад» .
  2. Найдите раздел «Антропический» и выберите «Клод Опус 4.6».

143753757bcc3ef0.png

  1. Выберите «Включить» , вам потребуется заполнить некоторую информацию. Заполните форму и нажмите «Далее».
  2. На последней странице выберите «Согласен» , чтобы включить Claude 4.6 Opus.

ece502115e10ca47.png

  1. Вы должны увидеть страницу с подтверждением успеха.

7290e50f7dd82a89.png

5. Создайте NAT-шлюз и виртуальные машины.

Нам необходимо разрешить исходящий внешний доступ к интернету, поэтому давайте создадим шлюз Cloud NAT и подключим его.

В Cloud Shell используйте следующие команды.

  1. Создайте Cloud NAT и шлюз Cloud NAT.
gcloud compute routers create anthro-out-nat \
    --network $networkid \
    --region us-east1 

gcloud compute routers nats create anthro-out-nat-gw \
    --router-region us-east1 \
    --router anthro-out-nat \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

Теперь давайте создадим одну виртуальную машину для доступа к Anthropic на Vertex AI через Python SDK.

  1. В той же сессии Cloud Shell создайте виртуальную машину anthro-vm, используя следующий код. (Пожалуйста, подождите 3-4 минуты, пока виртуальная машина станет активной, пока выполняется установка скрипта запуска).
gcloud compute instances create anthro-vm \
--project=$projectid \
--zone=us-east1-b \
--network-interface=stack-type=IPV4_ONLY,subnet=vm-subnet,no-address,network=$networkid \
--metadata startup-script="#! /bin/bash
      apt-get update
      apt-get install python3 python3-dev python3-venv tcpdump dnsutils -y
      python3 -m venv /opt/py-anthro-env
      /opt/py-anthro-env/bin/pip install -U google-genai 'anthropic[vertex]' rich
      chmod -R 777 /opt/py-anthro-env"

Вы должны увидеть созданную виртуальную машину без публичных IP-адресов. Теперь давайте настроим виртуальную машину.

6. Настройте виртуальную машину и протестируйте.

  1. В Google Cloud Shell можно подключиться по SSH к новой виртуальной машине под названием anthro-vm . (Возможно, потребуется подождать 3 минуты, чтобы убедиться в полной настройке виртуальной машины).
gcloud compute ssh anthro-vm \
    --project=$projectid \
    --zone=us-east1-b \
    --tunnel-through-iap \
    -- -L 8080:localhost:8080
  1. После установления соединения давайте проведём быструю проверку, чтобы убедиться, что мы можем подключиться к API Vertex Gemini.
dig *-aiplatform.googleapis.com
  1. Вы должны увидеть что-то похожее ( адреса будут отличаться ). Обратите внимание, что путь проходит через публичные IP-адреса, поскольку API является публичным API.
; <<>> DiG 9.18.39-0ubuntu0.24.04.2-Ubuntu <<>> *-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3728
;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;*-aiplatform.googleapis.com.   IN      A

;; ANSWER SECTION:
*-aiplatform.googleapis.com. 300 IN     A       172.217.204.95
*-aiplatform.googleapis.com. 300 IN     A       172.217.203.95
*-aiplatform.googleapis.com. 300 IN     A       173.194.215.95
*-aiplatform.googleapis.com. 300 IN     A       142.250.98.95
*-aiplatform.googleapis.com. 300 IN     A       173.194.217.95
*-aiplatform.googleapis.com. 300 IN     A       142.251.107.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.196.95
  1. Теперь активируйте свою виртуальную среду (venv):
source /opt/py-anthro-env/bin/activate
  1. Теперь давайте проверим аутентификацию, чтобы провести тестирование позже. Выполните следующую команду в виртуальной машине и нажмите «y» , когда появится соответствующий запрос.
gcloud auth application-default login
  1. Далее скопируйте URL-адрес, который начинается с https://, откройте новую вкладку в окне браузера вашей лаборатории и вставьте URL-адрес. Подтвердите запросы.
  2. Когда вы увидите следующее поле «Выберите и скопируйте», вернитесь в сессию vm anthro-vm и в поле «Введите код авторизации» вставьте скопированный код и нажмите Enter для аутентификации.

b703db7aa2aa286a.png

  1. Теперь давайте используем Python в нашей env . Это создаст файл Python super-gen-ai.py , который задаст Claude Opus 4.6 вопрос: « Каковы ключевые шаги для создания агентного ИИ? », затем возьмет результат и передаст его Gemini 3.1 pro, который создаст сводку, а затем Gemini 3 pro image сгенерирует образ, который сохранит на виртуальной машине.

Скопируйте и вставьте следующее.

cat << 'EOF' > super-gen-ai.py
import os
import subprocess
import google.auth
from google import genai
from google.genai import types
from anthropic import AnthropicVertex
from rich.console import Console
from rich.panel import Panel
from rich.spinner import SPINNERS
from rich.text import Text

# Custom Super Me Animation Spinner - Now with moving power-up!
SPINNERS["super_me"] = {
    "interval": 120,
    "frames": [
        "🧱🦖          🍄",
        "🧱 🦖        🍄 ",
        "🧱  🦖      🍄  ",
        "🧱   🦕    🍄   ",
        "🧱    🦖  🍄    ",
        "🧱     🦖🍄     ",
        "🧱      🌟      ",
        "🧱       🌟     ",
        "🧱        🌟    ",
        "🧱         🌟   ",
        "🧱        🌟    ",
        "🧱       🌟     ",
        "🧱      🌟      ",
        "🧱     🌟       ",
        "🧱    🌟        ",
        "🧱   🌟         ",
        "🧱  🌟          ",
        "🧱 🌟           ",
        "🧱🌟            "
    ]
}

console = Console()

def print_super_me_header():
    super_me_art = """
[bold red]   _____                       [/bold red][bold green]  __  __      _ [/bold green]
[bold red]  / ____|                      [/bold red][bold green] |  \/  |    | |[/bold green]
[bold red] | (___  _   _ _ __   ___ _ __ [/bold red][bold green] | \  / | ___| |[/bold green]
[bold red]  \___ \| | | | '_ \ / _ \ '__|[/bold red][bold green] | |\/| |/ _ \ |[/bold green]
[bold red]  ____) | |_| | |_) |  __/ |   [/bold red][bold green] | |  | |  __/_|[/bold green]
[bold red] |_____/ \__,_| .__/ \___|_|   [/bold red][bold green] |_|  |_|\___(_)[/bold green]
[bold red]              | |              [/bold red][bold green]                 [/bold green]
[bold red]              |_|              [/bold red][bold green]                 [/bold green]
    """
    console.print(super_me_art)
    console.rule("[bold gold1]⭐ LEVEL 1-1: Vertex AI Orchestrator ⭐[/bold gold1]")

def main():
    os.system('clear')  # Clears the terminal for a clean UI
    print_super_me_header()
    
    # Create the images directory
    os.makedirs("images", exist_ok=True)

    with console.status("[bold yellow]🪙  Collecting Coins (Authenticating)...[/bold yellow]", spinner="super_me"):
        try:
            creds, project_id = google.auth.default()
            LOCATION = "global" 
        except Exception as e:
            console.print(f"[bold red]💥 GAME OVER! Authentication failed:[/bold red] {e}")
            return 

    with console.status(f"[bold green]🍄 Powering up Clients for {project_id}...[/bold green]", spinner="super_me"):
        google_client = genai.Client(vertexai=True, location=LOCATION, project=project_id)
        claude_client = AnthropicVertex(region=LOCATION, project_id=project_id)

    console.print("\n[bold cyan]The Kingdom needs a strategy![/bold cyan]")
    
    # Auto-run prompt without user interaction
    question = "What are the key steps to building Agentic AI?"
    
    console.print(Panel(question, title="[bold green]Green Dino (Claude Opus) is entering the pipe...[/bold green]", border_style="green"))

    with console.status("[bold green]🟢 Green Dino is clearing the level...\n[/bold green]", spinner="super_me"):
        try:
            msg = claude_client.messages.create(
                model="claude-opus-4-6", 
                max_tokens=2048,
                messages=[{"role": "user", "content": question}]
            )
            claude_text = msg.content[0].text
            console.print(f"[bold green]✓ Level Cleared! Green Dino generated {len(claude_text)} bytes of strategy.[/bold green]\n")
        except Exception as e:
            console.print(f"[bold red]💥 BOSS ATTACK (Claude API Error):[/bold red] {e}")
            return

    with console.status("[bold red]🔴 Red Hero (Gemini 3.1 Pro Preview) is summarizing the map...\n[/bold red]", spinner="super_me"):
        text_prompt = f"""
        I am providing you with a response generated by Claude.
        1. READ the text below.
        2. GENERATE a concise, bulleted executive summary.

        --- INPUT TEXT ---
        {claude_text}
        """
        
        try:
            text_response = google_client.models.generate_content(
                model="gemini-3.1-pro-preview", 
                contents=text_prompt,
                config=types.GenerateContentConfig(temperature=0.7)
            )
            console.print("[bold red]✓ Super Me! Text Summary Complete.[/bold red]")
        except Exception as e:
            console.print(f"[bold red]💥 CHOMPER PLANT (Gemini Text Error):[/bold red] {e}")
            return

    with console.status("[bold blue]🔵 Mushroom Friend (Gemini 3 Pro Image) is painting the castle...\n[/bold blue]", spinner="super_me"):
        image_prompt = f"""
        CREATE a high-quality, futuristic illustration of autonomous AI agents for a tech blog header (16:9 aspect ratio).
        Base the image directly on the following text summary:
        
        {text_response.text}
        """
        
        try:
            image_response = google_client.models.generate_content(
                model="gemini-3-pro-image-preview", 
                contents=image_prompt,
                config=types.GenerateContentConfig(
                    response_modalities=['TEXT', 'IMAGE'],
                    temperature=0.7
                )
            )
            console.print("[bold blue]✓ Masterpiece Complete![/bold blue]\n")
        except Exception as e:
            console.print(f"[bold red]💥 FALLING BLOCK (Gemini Image Error):[/bold red] {e}")
            return

    console.rule("[bold gold1]🚩 COURSE CLEAR! 🚩[/bold gold1]")
    
    if text_response.text:
        console.print(Panel(text_response.text.strip(), 
                            title="[bold gold1]Gemini 3.1 Pro Summary[/bold gold1]", 
                            border_style="gold1"))

    for part in image_response.parts:
        if image := part.as_image():
            # Save inside the images folder with the focus-specific name
            filename = "images/building-agentic.png"
            image.save(filename)
            console.print(f"\n[bold green]✓ REWARD SAVED:[/bold green] [underline]{os.path.abspath(filename)}[/underline]")

    console.rule("[bold red]Web Server Warp Pipe[/bold red]")
    with console.status("[bold yellow]Opening the warp pipe (HTTP server)...[/bold yellow]", spinner="super_me"):
        # Kill any existing server first so it doesn't crash on port binding
        os.system('pkill -f "http.server" > /dev/null 2>&1')
        
        # Start the server with the root directory set specifically to 'images'
        subprocess.Popen(
            ["python3", "-m", "http.server", "8080", "--directory", "images"], 
            stdout=subprocess.DEVNULL, 
            stderr=subprocess.DEVNULL
        )
        
    console.print("[bold green]✓ Warp Pipe is open in the background![/bold green]")
    console.print("[bold magenta]View your files here (Click Web Preview -> Preview on port 8080):[/bold magenta] [underline]http://localhost:8080/[/underline]\n")

if __name__ == "__main__":
    main()
EOF

python3 super-gen-ai.py

Скрипт работает в удобном интерфейсе и запускает веб-сервер, чтобы вы могли просмотреть полученное изображение. Чтобы запустить скрипт снова, введите python3 super-gen-ai.py .

  1. Для предварительного просмотра веб-страниц в Cloud Shell выберите опцию предварительного просмотра на порту 8080. 6dcb2bf9a08aacaf.png
  2. В открытой веб-сессии выберите файл building_agentic.png , чтобы просмотреть сгенерированное изображение. (Пример изображения, сгенерированного ИИ, приведен ниже)
    fdcb79d8410dadc5.png
  3. Для выхода из веб-сервера в Cloud Shell выполните следующую команду.
pkill -f "http.server"
  1. Далее, чтобы вернуться в дом Cloud Shell, воспользуйтесь функцией exit . После этого продолжим.

7. Создайте конечную точку PSC для googleapis.

Для обеспечения частного подключения к нашей конечной точке API Vertex мы создадим конечную точку Private Service Connect для googleapis. Это позволит нам использовать назначенный нами частный IP-адрес для маршрутизации трафика к необходимой нам конечной точке googleapis, в данном случае Vertex Gemini.

  1. Откройте Cloud Shell, если он еще не открыт. Мы создадим IP-адрес для конечной точки PSC и создадим конечную точку Private Service Connect. В данном случае мы будем использовать 192.168.255.230 .
projectid=$(gcloud config get-value project)
networkid=anthropic-net

gcloud compute addresses create anthro-ip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=192.168.255.230 \
    --network=$networkid

gcloud compute forwarding-rules create pscanthrovertex \
    --global \
    --network=$networkid \
    --address=anthro-ip \
    --target-google-apis-bundle=all-apis
  1. Проверять
gcloud compute addresses list --filter="name=( 'anthro-ip' ...)"

gcloud compute forwarding-rules describe pscanthrovertex --global

8. Создайте запись DNS вручную для googleapis

Вы можете создать запись DNS вручную, указывающую на конечную точку PSC, используя частный DNS. Это повлияет на все сети, которые вы к ней назначите. Теперь вам нужно создать следующее.

  • Создайте частную DNS-зону для googleapis.com и подключите её к сети anthropic-net.
  • Запись типа A, сопоставляющая корневой домен с IP-адресом конечной точки Private Service Connect (192.168.255.230).
  • Запись CNAME с подстановочным знаком для перенаправления всех поддоменов (например, aiplatform.googleapis.com) на корневую запись A.
  1. Выполните следующие команды в Cloud Shell.
gcloud dns managed-zones create googleapis-private \
    --description="Private DNS zone for googleapis.com" \
    --dns-name="googleapis.com." \
    --visibility="private" \
    --networks="anthropic-net"

gcloud dns record-sets create "googleapis.com." \
    --zone="googleapis-private" \
    --type="A" \
    --ttl="300" \
    --rrdatas="192.168.255.230"

gcloud dns record-sets create "*.googleapis.com." \
    --zone="googleapis-private" \
    --type="CNAME" \
    --ttl="300" \
    --rrdatas="googleapis.com."
  1. Чтобы подтвердить корректность создания записи A и записи CNAME, отобразите список наборов записей в зоне.
gcloud dns record-sets list --zone="googleapis-private"
  1. В консоли это должно выглядеть примерно так. Вы должны увидеть настройку с записью A и записью CNAME, как показано ниже. a51a8b8caa7a0f1e.png
  2. Далее мы проверим совместимость с этими изменениями на anthro-vm.

9. Проверьте подключение конечной точки по IP-адресу.

Давайте подключимся к Gemini, используя частную конечную точку.

  1. В Google Cloud Shell можно подключиться по SSH к новой виртуальной машине под названием anthro-vm .
gcloud compute ssh anthro-vm \
    --project=$projectid \
    --zone=us-east1-b \
    --tunnel-through-iap \
    -- -L 8080:localhost:8080
  1. В вашей виртуальной машине проверьте путь подключения к aiplatform-pscanthrovertex.p.googleapis.com с помощью команды dig . Вы должны увидеть IP-адрес конечной точки PSC 192.168.255.230
dig aiplatform-pscanthrovertex.p.googleapis.com +noall +answer

Давайте подключимся к Gemini, используя частную конечную точку.

  1. Теперь давайте dig подключиться к API Vertex Gemini.
dig *-aiplatform.googleapis.com
  1. Вы должны увидеть что-то похожее (адрес будет отличаться). Обратите внимание, что путь проходит через IP-адреса конечных точек PSC.
; <<>> DiG 9.18.41-1~deb12u1-Debian <<>> *-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33703
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;*-aiplatform.googleapis.com.   IN      A

;; ANSWER SECTION:
*-aiplatform.googleapis.com. 300 IN     CNAME   googleapis.com.
googleapis.com.         300     IN      A       192.168.255.230

;; Query time: 8 msec
;; SERVER: 169.254.169.254#53(169.254.169.254) (UDP)
;; WHEN: Sat Nov 29 15:19:15 UTC 2025
;; MSG SIZE  rcvd: 86
  1. Используя команду ping , мы можем провести быструю проверку. Примечание: этот IP-адрес является конечной точкой PSC, и ваши пинги будут неудачными.
ping -c 2 aiplatform.googleapis.com
  1. Теперь активируйте свою виртуальную среду (venv):
source /opt/py-anthro-env/bin/activate
  1. Теперь давайте используем Python в нашей env . Это создаст файл Python star-me.py , который задаст Claude Opus 4.6 вопрос: « Дайте мне пошаговый рецепт приготовления роти для начинающего? » Затем он возьмет результат и передаст его Gemini 3.1 Pro , который создаст сводку, а Gemini 3 Pro сгенерирует образ и сохранит его на виртуальной машине.
cat << 'EOF' > star-me.py
import os
import subprocess
import google.auth
from google import genai
from google.genai import types
from anthropic import AnthropicVertex
from rich.console import Console
from rich.panel import Panel
from rich.spinner import SPINNERS
from rich.text import Text

# Custom Star Me Animation Spinner - Directional Flight!
SPINNERS["star_me"] = {
    "interval": 120,
    "frames": [
        "🌌 🚀              🛸 ",
        "🌌  🚀            🛸  ",
        "🌌   🚀          🛸   ",
        "🌌    🚀        🛸    ",
        "🌌     🚀      🛸     ",
        "🌌      🚀    🛸      ",
        "🌌       🚀  🛸       ",
        "🌌        🚀🛸        ",
        "🌌         💥         ",
        "🌌        ✨ ✨       ",
        "🌌       ✨   ✨      ",
        "🌌      ✨     ✨     ",
        "🌌     ✨       ✨    ",
        "🌌                    "
    ]
}

console = Console()

def print_star_me_header():
    star_me_art = """
[bold cyan]   _____ _______       _____    __  __ ______ [/bold cyan]
[bold cyan]  / ____|__   __|/\   |  __ \  |  \/  |  ____|[/bold cyan]
[bold cyan] | (___    | |  /  \  | |__) | | \  / | |__   [/bold cyan]
[bold cyan]  \___ \   | | / /\ \ |  _  /  | |\/| |  __|  [/bold cyan]
[bold cyan]  ____) |  | |/ ____ \| | \ \  | |  | | |____ [/bold cyan]
[bold cyan] |_____/   |_/_/    \_\_|  \_\ |_|  |_|______|[/bold cyan]
    """
    console.print(star_me_art)
    console.rule("[bold gold1]⭐ EPISODE I: The AI Awakening ⭐[/bold gold1]")

def main():
    os.system('clear')  # Clears the terminal for a clean UI
    print_star_me_header()
    
    # Create the images directory
    os.makedirs("images", exist_ok=True)

    with console.status("[bold yellow]🪙  Bypassing Security (Authenticating)...[/bold yellow]", spinner="star_me"):
        try:
            creds, project_id = google.auth.default()
            LOCATION = "global" 
        except Exception as e:
            console.print(f"[bold red]💥 COMM LINK SEVERED! Authentication failed:[/bold red] {e}")
            return 

    with console.status(f"[bold cyan]📡 Establishing secure connection for {project_id}...[/bold cyan]", spinner="star_me"):
        google_client = genai.Client(vertexai=True, location=LOCATION, project=project_id)
        claude_client = AnthropicVertex(region=LOCATION, project_id=project_id)

    console.print("\n[bold cyan]The Galaxy needs sustenance![/bold cyan]")
    
    # Auto-run prompt for the recipe
    question = "Give me a step by step recipe to make a roti for a beginner?"
    
    console.print(Panel(question, title="[bold green]Space Master (Claude Opus) is searching the archives...[/bold green]", border_style="green"))

    with console.status("[bold green]🟢 Space Master is compiling the ancient texts...\n[/bold green]", spinner="star_me"):
        try:
            msg = claude_client.messages.create(
                model="claude-opus-4-6", 
                max_tokens=2048,
                messages=[{"role": "user", "content": question}]
            )
            claude_text = msg.content[0].text
            console.print(f"[bold green]✓ Archives Retrieved! Space Master generated a {len(claude_text)}-character Holocron.[/bold green]\n")
        except Exception as e:
            console.print(f"[bold red]💥 INTERFERENCE DETECTED (Claude API Error):[/bold red] {e}")
            return

    with console.status("[bold gold1]🟡 Protocol Bot (Gemini 3.1 Pro Preview) is translating the recipe...\n[/bold gold1]", spinner="star_me"):
        text_prompt = f"""
        I am providing you with a response generated by a Space Master.
        1. READ the text below.
        2. GENERATE a concise, bulleted executive summary.

        --- INPUT TEXT ---
        {claude_text}
        """
        
        try:
            text_response = google_client.models.generate_content(
                model="gemini-3.1-pro-preview", 
                contents=text_prompt,
                config=types.GenerateContentConfig(temperature=0.7)
            )
            console.print("[bold gold1]✓ Translation Complete! The Protocol Bot has summarized the steps.[/bold gold1]")
        except Exception as e:
            console.print(f"[bold red]💥 SYSTEM FAILURE (Gemini Text Error):[/bold red] {e}")
            return

    with console.status("[bold blue]🔵 Astro Bot (Gemini 3 Pro Image) is projecting the hologram...\n[/bold blue]", spinner="star_me"):
        image_prompt = f"""
        CREATE a high-quality, beautiful illustration for a blog header (16:9 aspect ratio) of someone making roti, but with a subtle sci-fi, cinematic lighting aesthetic.
        Base the image directly on the following text summary:
        
        {text_response.text}
        """
        
        try:
            image_response = google_client.models.generate_content(
                model="gemini-3-pro-image-preview", 
                contents=image_prompt,
                config=types.GenerateContentConfig(
                    response_modalities=['TEXT', 'IMAGE'],
                    temperature=0.7
                )
            )
            console.print("[bold blue]✓ Hologram Projection Ready![/bold blue]\n")
        except Exception as e:
            console.print(f"[bold red]💥 BAD COMPRESSOR (Gemini Image Error):[/bold red] {e}")
            return

    console.rule("[bold cyan]🚩 MISSION ACCOMPLISHED 🚩[/bold cyan]")
    
    if text_response.text:
        console.print(Panel(text_response.text.strip(), 
                            title="[bold gold1]Protocol Bot Recipe Summary[/bold gold1]", 
                            border_style="gold1"))

    for part in image_response.parts:
        if image := part.as_image():
            # Save inside the images folder with the focus-specific name
            filename = "images/cookingroti.png"
            image.save(filename)
            console.print(f"\n[bold green]✓ DATA SECURED:[/bold green] [underline]{os.path.abspath(filename)}[/underline]")

    console.rule("[bold cyan]Hyperlink Uplink[/bold cyan]")
    with console.status("[bold yellow]Opening the frequencies (HTTP server)...[/bold yellow]", spinner="star_me"):
        # Kill any existing server first so it doesn't crash on port binding
        os.system('pkill -f "http.server" > /dev/null 2>&1')
        
        # Start the server with the root directory set specifically to 'images'
        subprocess.Popen(
            ["python3", "-m", "http.server", "8080", "--directory", "images"], 
            stdout=subprocess.DEVNULL, 
            stderr=subprocess.DEVNULL
        )
        
    console.print("[bold green]✓ Transmitting on Port 8080![/bold green]")
    console.print("[bold magenta]View your files here (Click Web Preview -> Preview on port 8080):[/bold magenta] [underline]http://localhost:8080/[/underline]\n")

if __name__ == "__main__":
    main()
EOF

python3 star-me.py

Скрипт работает в удобном интерфейсе и запускает веб-сервер, чтобы вы могли просмотреть полученное изображение. Чтобы запустить скрипт снова, введите команду python3 star-me.py

  1. Теперь перейдите к опции предварительного просмотра веб-страниц в Cloud Shell и выберите предварительный просмотр на порту 8080.

6dcb2bf9a08aacaf.png

  1. Выберите файл cookingroti.png , чтобы просмотреть сгенерированное изображение. (Пример ниже, сгенерированный искусственным интеллектом) bcf43fffede275cb.png
  2. Чтобы выйти из веб-сервера и вернуться к виртуальной машине, в Cloud Shell выполните следующие действия.
pkill -f "http.server"
  1. Следующий exit позволит вернуться в отель Cloud Shell.

10. Поздравляем!

Поздравляем, вы успешно подключились к Anthropic Claude Opus 4.6 и Gemini 3.1 Pro на Vertex, используя как публичный API-адрес, так и частный API-интерфейс через конечную точку Private Service Connect для Google API. Эта функциональность позволяет расширить возможности подключения через частные API в вашей локальной/другой облачной среде, подключенной через (межоблачное соединение, межоблачное соединение и VPC).

Уборка

gcloud compute instances delete anthro-vm --zone=us-east1-b --quiet

gcloud compute routers nats delete anthro-out-nat-gw --router=anthro-out-nat --region=us-east1 --quiet

gcloud compute routers delete anthro-out-nat --region=us-east1 --quiet

gcloud compute firewall-rules delete anthropic-net-allow-icmp anthropic-net-allow-ssh anthropic-net-allow-web --quiet

gcloud compute forwarding-rules delete pscanthrovertex --global --quiet

gcloud dns record-sets delete googleapis.com. --zone googleapis-private --type A --quiet

gcloud dns record-sets delete *.googleapis.com --zone googleapis-private --type CNAME --quiet

gcloud dns managed-zones delete googleapis-private --quiet

gcloud compute addresses delete anthro-ip --global --quiet

gcloud compute networks subnets delete vm-subnet --region=us-east1 --quiet

gcloud compute networks delete anthropic-net --quiet

Следующие шаги / Узнать больше

Вы можете узнать больше о сетевых технологиях Vertex AI.

Codelab : Доступ к чату Gemini 3 Pro с использованием Python SDK через конечную точку Private Service Connect.

Codelab : Создание агентов искусственного интеллекта с помощью ADK:The Foundation

Пройдите следующую лабораторную работу.

Продолжите свое знакомство с Google Cloud и ознакомьтесь с другими лабораторными работами Google Cloud Skills Boost: