Anthropic Claude Opus 4.6 i Gemini 3.1 w Vertex AI z użyciem pakietu Python SDK przez punkt końcowy Private Service Connect

1. Przegląd

Do interfejsu Vertex AI API można uzyskać dostęp przez internet, ale w firmie możesz chcieć korzystać z niego prywatnie, bez połączenia z internetem. W tym module najpierw uzyskasz dostęp do modeli Anthropic Claude Opus 4.6Gemini 3.1 Pro w Vertex za pomocą pakietu Python SDK działającego na instancji maszyny wirtualnej przez publiczny internet.

Następnie utworzysz punkt końcowy usługi Private Service Connect dla Googleapis i zmienisz przepływ ruchu, aby używać prywatnego punktu końcowego do łączenia się z interfejsem Vertex API.

Przykładowy kod w Pythonie przyjmie pytania wejściowe, przekaże je do Claude Opus, aby wygenerować odpowiedź, a następnie przekaże wynik do Gemini 3, aby utworzyć podsumowanie tekstowe i wygenerować obraz.

W tym module utworzysz ten wzorzec.

Rysunek 1.

c8f37e193349bfd6.png

2. Cele

Z tego modułu dowiesz się, jak:

  • Konfigurowanie instancji maszyny wirtualnej do korzystania z pakietu Python SDK
  • Włączanie karty modelu Anthropic w Vertex AI
  • Łączenie się z Anthropic Claude Opus 4.6Gemini 3.1 Pro za pomocą skryptu w Pythonie
  • Konfigurowanie punktu końcowego PSC do łączenia się z Googleapis
  • Konfigurowanie ręcznych wpisów DNS
  • Sprawdzanie ścieżki połączenia z Googleais
  • Uruchom skrypt w Pythonie, aby wysłać zapytanie do modeli.

Konfiguracja laboratorium

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchom Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym ćwiczeniu użyjesz Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

Aktywowanie Cloud Shell

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno wyświetlić się coś takiego:

Zrzut ekranu terminala Google Cloud Shell pokazujący, że środowisko zostało połączone

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Wszystkie zadania w tym laboratorium możesz wykonać w przeglądarce. Nie musisz niczego instalować.

3. Konfigurowanie środowiska

Utworzymy niestandardową sieć VPC z regułami zapory sieciowej. Jeśli masz już VPC i projekt, możesz pominąć tę część.

Otwórz Cloud Shell w prawym górnym rogu konsoli. Skonfiguruj je w ten sposób: b51b80043d3bac90.png

  1. Włącz niektóre interfejsy API, których będziemy używać w tym module.
gcloud services enable dns.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable servicedirectory.googleapis.com
  1. Ustaw zmienne. Te zmienne to identyfikator projektu i identyfikator sieci niestandardowej sieci VPC (sieć VPC utworzysz w kroku 4).
projectid=$(gcloud config get-value project)
networkid=anthropic-net 
echo $projectid
echo $networkid
  1. Teraz utwórz niestandardową sieć VPC (anthropic-net), podsieć (vm1-subnet) i reguły zapory sieciowej.
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. Włączanie Anthropic w bazie modeli Vertex

Musimy przyznać wychodzący dostęp zewnętrzny do internetu, więc utwórzmy bramę Cloud NAT i dołączmy ją.

  1. Otwórz panel Vertex AI i wybierz Bazę modeli.
  2. Wyszukaj Anthropic i wybierz Claude Opus 4.6.

143753757bcc3ef0.png

  1. Kliknij Włącz. Musisz podać kilka informacji. Wypełnij formularz i kliknij Dalej.
  2. Na ostatniej stronie kliknij Zgadzam się, aby włączyć Claude 4.6 Opus.

ece502115e10ca47.png

  1. Powinna wyświetlić się strona z potwierdzeniem.

7290e50f7dd82a89.png

5. Tworzenie bramy NAT i maszyn wirtualnych

Musimy przyznać wychodzący dostęp zewnętrzny do internetu, więc utwórzmy bramę Cloud NAT i dołączmy ją.

W Cloud Shell użyj tych poleceń:

  1. Tworzenie Cloud NAT i bramy 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

Teraz utwórzmy jedną maszynę wirtualną, aby uzyskać dostęp do Anthropic w Vertex AI za pomocą pakietu Python SDK.

  1. W tej samej sesji Cloud Shell utwórz instancję anthro-vm za pomocą tego polecenia. (Odczekaj 3–4 minuty, aż maszyna wirtualna będzie aktywna podczas instalacji skryptu startowego)
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"

Powinna być widoczna utworzona maszyna wirtualna bez publicznych adresów IP. Teraz skonfigurujmy

6. Konfigurowanie i testowanie maszyny wirtualnej

  1. W Google Cloud Shell połącz się przez SSH z nową maszyną wirtualną o nazwie anthro-vm. (Może być konieczne odczekanie 3 minut, aby mieć pewność, że maszyna wirtualna została w pełni skonfigurowana).
gcloud compute ssh anthro-vm \
    --project=$projectid \
    --zone=us-east1-b \
    --tunnel-through-iap \
    -- -L 8080:localhost:8080
  1. Po połączeniu przeprowadźmy szybki test, aby sprawdzić, czy możemy połączyć się z interfejsem Vertex Gemini API.
dig *-aiplatform.googleapis.com
  1. Powinien pojawić się ekran podobny do tego (adresy będą inne). Pamiętaj, że ścieżka prowadzi przez publiczne adresy IP, ponieważ interfejs API jest publiczny.
; <<>> 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. Teraz aktywuj środowisko venv:
source /opt/py-anthro-env/bin/activate
  1. Teraz uwierzytelnijmy to, aby później przeprowadzić testy. Uruchom w maszynie wirtualnej to polecenie i po wyświetleniu monitu naciśnij y.
gcloud auth application-default login
  1. Następnie skopiuj adres URL zaczynający się od https://, otwórz nową kartę w oknie przeglądarki laboratorium i wklej adres URL. Zaakceptuj prompty.
  2. Gdy zobaczysz poniższy tekst, skopiuj go, wróć do sesji maszyny wirtualnej anthro-vm i w sekcji Enter authorization code: (Wpisz kod autoryzacji:) wklej skopiowany kod i naciśnij Enter, aby się uwierzytelnić.

b703db7aa2aa286a.png

  1. Teraz użyjemy Pythona w env. Spowoduje to utworzenie pliku Pythona super-gen-ai.py, który zadaje modelowi Claude Opus 4.6 pytanie: „Jakie są najważniejsze kroki w budowaniu agentowej AI?”. Następnie przekazuje wynik do Gemini 3.1 Pro, który tworzy podsumowanie, a potem Gemini 3 Pro Image generuje obraz i zapisuje go na maszynie wirtualnej.

Skopiuj i wklej poniższy tekst.

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

Skrypt działa w ciekawym interfejsie i uruchamia serwer WWW, dzięki czemu możesz wyświetlić wygenerowany obraz. Aby ponownie uruchomić skrypt, wpisz python3 super-gen-ai.py.

  1. Opcja podglądu w przeglądarce w Cloud Shell, wybierz podgląd na porcie 8080 6dcb2bf9a08aacaf.png
  2. W otwartej sesji internetowej wybierz building_agentic.png, aby wyświetlić wygenerowany obraz. (Przykładowy obraz wygenerowany przez AI)
    fdcb79d8410dadc5.png
  3. Aby zamknąć serwer WWW w Cloud Shell, uruchom to polecenie:
pkill -f "http.server"
  1. Następnie wpisz exit, aby wrócić do strony głównej Cloud Shell. Gdy to zrobisz, przejdźmy dalej.

7. Tworzenie punktu końcowego PSC dla googleapis

Aby włączyć prywatną łączność z naszym punktem końcowym interfejsu Vertex API, utworzymy punkt końcowy usługi Private Service Connect dla googleapis. Dzięki temu będziemy mogli używać przypisanego przez nas prywatnego adresu IP do kierowania ruchu do potrzebnych nam interfejsów googleapis, w tym przypadku Vertex Gemini.

  1. Otwórz Cloud Shell, jeśli nie jest jeszcze otwarty. Utworzymy adres IP dla punktu końcowego PSC i utworzymy punkt końcowy Private Service Connect. W tym przypadku użyjemy adresu 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. Zweryfikuj
gcloud compute addresses list --filter="name=( 'anthro-ip' ...)"

gcloud compute forwarding-rules describe pscanthrovertex --global

8. Tworzenie ręcznego wpisu DNS dla googleapis

Możesz utworzyć ręczny wpis DNS, aby wskazywał punkt końcowy PSC przy użyciu prywatnego DNS. Będzie to miało wpływ na wszystkie sieci, które do niej przypiszesz. Teraz utworzysz:

  • Prywatną strefę DNS dla domeny googleapis.com i dołącz ją do sieci anthropic-net.
  • Rekord A mapujący domenę główną na adres IP punktu końcowego Private Service Connect (192.168.255.230).
  • rekord CNAME z symbolem wieloznacznym, który przekierowuje wszystkie subdomeny (np. aiplatform.googleapis.com) do głównego rekordu A;
  1. Uruchom te polecenia w 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. Wyświetl listę zestawów rekordów w strefie, aby potwierdzić, że rekord A i CNAME zostały utworzone prawidłowo.
gcloud dns record-sets list --zone="googleapis-private"
  1. W widoku konsoli powinno to wyglądać tak: Powinna pojawić się konfiguracja z rekordem ACNAME, jak pokazano na ilustracji a51a8b8caa7a0f1e.png.
  2. Następnie sprawdzamy łączność po wprowadzeniu tych zmian na maszynie wirtualnej anthro-vm.

9. Sprawdzanie łączności punktu końcowego za pomocą adresu IP

Połączmy się z Gemini za pomocą prywatnego punktu końcowego.

  1. W Google Cloud Shell połącz się z nową maszyną wirtualną o nazwie anthro-vm za pomocą SSH.
gcloud compute ssh anthro-vm \
    --project=$projectid \
    --zone=us-east1-b \
    --tunnel-through-iap \
    -- -L 8080:localhost:8080
  1. Na maszynie wirtualnej sprawdź ścieżkę połączenia z adresem aiplatform-pscanthrovertex.p.googleapis.com za pomocą polecenia dig. Powinien być widoczny adres IP punktu końcowego PSC 192.168.255.230.
dig aiplatform-pscanthrovertex.p.googleapis.com +noall +answer

Połączmy się z Gemini za pomocą prywatnego punktu końcowego.

  1. Teraz wykonaj dig, aby sprawdzić, czy możesz połączyć się z interfejsem Vertex Gemini API.
dig *-aiplatform.googleapis.com
  1. Powinien pojawić się ekran podobny do tego (adres będzie inny). Zwróć uwagę, że ścieżka prowadzi przez adresy IP punktu końcowego 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. Użyj polecenia ping. Możemy przeprowadzić szybki test. Uwaga: ten adres IP to punkt końcowy PSC, więc pingi nie będą działać.
ping -c 2 aiplatform.googleapis.com
  1. Teraz aktywuj środowisko venv:
source /opt/py-anthro-env/bin/activate
  1. Teraz użyjemy Pythona w env. Spowoduje to utworzenie pliku Pythona star-me.py, który zada modelowi Claude Opus 4.6 pytanie: „Podaj szczegółowy przepis na roti dla początkujących”. następnie przekazuje wynik do Gemini 3.1 Pro, który tworzy podsumowanie, a Gemini 3 Pro Image generuje obraz i zapisuje go na maszynie wirtualnej.
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

Skrypt działa w ciekawym interfejsie i uruchamia serwer WWW, dzięki czemu możesz wyświetlić wygenerowany obraz. Aby ponownie uruchomić skrypt, wpisz python3 star-me.py

  1. Teraz przejdź do opcji podglądu w przeglądarce w Cloud Shell i wybierz podgląd na porcie 8080.

6dcb2bf9a08aacaf.png

  1. Kliknij cookingroti.png, aby wyświetlić wygenerowany obraz. (Przykładowy tekst wygenerowany przez AI) bcf43fffede275cb.png
  2. Aby zamknąć serwer WWW i wrócić do maszyny wirtualnej, w Cloud Shell wpisz to polecenie:
pkill -f "http.server"
  1. Następnie wpisz exit, aby wrócić do strony głównej Cloud Shell.

10. Gratulacje

Gratulacje! Udało Ci się nawiązać połączenie z Anthropic Claude Opus 4.6Gemini 3.1 Pro w Vertex zarówno za pomocą publicznego interfejsu API, jak i prywatnie za pomocą punktu końcowego Private Service Connect dla Googleapis. Ta funkcja może rozszerzyć łączność z prywatnymi interfejsami API na środowisko lokalne lub inne środowisko w chmurze, które są połączone za pomocą połączenia międzysieciowego, połączenia międzychmurowego i sieci VPC.

Czyszczenie danych

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

Kolejne kroki / Więcej informacji

Więcej informacji o sieci Vertex AI

Codelab Uzyskiwanie dostępu do czatu Gemini 3 Pro za pomocą pakietu Python SDK przez punkt końcowy Private Service Connect

Codelab Tworzenie agentów AI z użyciem ADK:podstawy

Przejdź do kolejnego modułu

Kontynuuj naukę o Google Cloud i zapoznaj się z tymi modułami Google Cloud Skills Boost: