Anthropic Claude Opus 4.6 et Gemini 3.1 sur Vertex AI avec le SDK Python via un point de terminaison Private Service Connect

1. Présentation

L'API Vertex AI est accessible sur Internet. Toutefois, dans votre entreprise, vous pouvez souhaiter y accéder de manière privée, sans passer par Internet. Dans cet atelier, vous allez d'abord accéder à Anthropic Claude Opus 4.6 et Gemini 3.1 Pro sur Vertex via le SDK Python exécuté sur une instance de VM via l'Internet public.

Vous allez ensuite créer un point de terminaison Private Service Connect vers Googleapis et modifier le flux de trafic pour utiliser le point de terminaison privé afin de vous connecter à l'API Vertex.

L'exemple de code Python prendra les questions saisies, les transmettra à Claude Opus pour générer une réponse, puis transmettra cette sortie à Gemini 3 pour créer un résumé textuel et générer une image.

Dans cet atelier, vous allez créer le modèle suivant.

Figure 1.

c8f37e193349bfd6.png

2. Objectifs

Dans cet atelier, vous apprendrez à effectuer la tâche suivante :

  • Configurer une instance de VM pour utiliser le SDK Python
  • Activer la fiche de modèle Anthropic dans Vertex AI
  • Se connecter à Anthropic Claude Opus 4.6 et Gemini 3.1 Pro via un script Python
  • Configurer un point de terminaison PSC pour se connecter à Googleapis
  • Configurer des entrées DNS manuelles
  • Vérifier le chemin de connectivité vers Googleais
  • Exécuter le script Python pour interroger les modèles

Mettre en place l'atelier

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pourrez toujours le modifier.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Dans la console Google Cloud, cliquez sur l'icône Cloud Shell dans la barre d'outils supérieure :

Activer Cloud Shell

Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :

Capture d'écran du terminal Google Cloud Shell montrant que l'environnement est connecté

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez effectuer toutes les tâches de cet atelier de programmation dans un navigateur. Vous n'avez rien à installer.

3. Configurer l'environnement

Nous allons créer un VPC personnalisé avec des règles de pare-feu. Si vous disposez déjà d'un VPC et d'un projet, vous pouvez ignorer cette partie.

Ouvrez Cloud Shell en haut à droite de la console. Configurez-le comme suit : b51b80043d3bac90.png

  1. Activer certaines des API que nous utiliserons dans cet atelier
gcloud services enable dns.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable servicedirectory.googleapis.com
  1. Définissez des variables. Ces variables sont l'ID du projet et l'ID du réseau du VPC personnalisé (vous créerez le VPC à l'étape 4).
projectid=$(gcloud config get-value project)
networkid=anthropic-net 
echo $projectid
echo $networkid
  1. Créez maintenant un VPC personnalisé (anthropic-net), un sous-réseau (vm1-subnet) et des règles de pare-feu.
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. Activer Anthropic dans Vertex Model Garden

Nous devons accorder un accès externe sortant à Internet. Créons donc une passerelle Cloud NAT et associons-la.

  1. Accédez au tableau de bord Vertex AI, puis sélectionnez Model Garden.
  2. Recherchez Anthropic et sélectionnez Claude Opus 4.6.

143753757bcc3ef0.png

  1. Sélectionnez Activer, puis remplissez les informations demandées et cliquez sur Suivant.
  2. Sur la dernière page, sélectionnez Accepter pour activer Claude 4.6 Opus.

ece502115e10ca47.png

  1. La page de confirmation devrait s'afficher.

7290e50f7dd82a89.png

5. Créer une passerelle NAT et des VM

Nous devons accorder un accès externe sortant à Internet. Créons donc une passerelle Cloud NAT et associons-la.

Dans Cloud Shell, utilisez les commandes suivantes.

  1. Créer Cloud NAT et la passerelle 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

Créons maintenant une VM pour accéder à Anthropic sur Vertex AI via le SDK Python.

  1. Dans la même session Cloud Shell, créez anthro-vm à l'aide de la commande suivante. (Veuillez patienter trois à quatre minutes pour que la VM soit active pendant l'installation du script de démarrage.)
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"

Vous devriez voir une VM créée sans adresse IP publique. Maintenant, configurons les

6. Configurer la VM et effectuer un test

  1. Dans Google Cloud Shell, connectez-vous en SSH à la nouvelle VM nommée anthro-vm. (Vous devrez peut-être attendre trois minutes pour vous assurer que la VM est complètement configurée.)
gcloud compute ssh anthro-vm \
    --project=$projectid \
    --zone=us-east1-b \
    --tunnel-through-iap \
    -- -L 8080:localhost:8080
  1. Une fois la connexion établie, effectuons un test rapide pour voir si nous pouvons nous connecter à l'API Vertex Gemini.
dig *-aiplatform.googleapis.com
  1. Le résultat doit ressembler à ceci (les adresses seront différentes). Notez que le chemin d'accès se fait via des adresses IP publiques, car l'API est publique.
; <<>> 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. Activez maintenant votre environnement venv :
source /opt/py-anthro-env/bin/activate
  1. Authentifions-le maintenant pour effectuer des tests plus tard. Exécutez la commande suivante dans la VM, puis appuyez sur y lorsque vous y êtes invité.
gcloud auth application-default login
  1. Copiez ensuite l'URL qui commence par https://, ouvrez un nouvel onglet dans la fenêtre du navigateur de l'atelier et collez l'URL. Acceptez les invites.
  2. Lorsque le message suivant s'affiche, sélectionnez "Copier", revenez à la session de la VM anthro-vm, puis collez le code copié dans Enter authorization code: (Saisissez le code d'autorisation) et appuyez sur Entrée pour vous authentifier.

b703db7aa2aa286a.png

  1. Utilisons maintenant Python dans notre env. Cela crée un fichier Python super-gen-ai.py qui demande à Claude Opus 4.6 "Quelles sont les principales étapes de la création d'une IA agentique ?". prend ensuite la sortie et la transmet à Gemini 3.1 Pro, qui crée un résumé, puis Gemini 3 Pro Image génère une image qu'il enregistre sur la VM.

Copiez et collez le texte ci-dessous

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

Le script s'exécute dans une interface amusante et lance un serveur Web pour que vous puissiez afficher le résultat de l'image. Pour exécuter à nouveau le script, saisissez python3 super-gen-ai.py.

  1. Pour afficher l'option d'aperçu Web dans Cloud Shell, sélectionnez "Prévisualiser sur le port 8080" 6dcb2bf9a08aacaf.png.
  2. Dans la session Web ouverte, sélectionnez building_agentic.png pour afficher l'image générée. (Exemple d'image générée par l'IA ci-dessous)
    fdcb79d8410dadc5.png
  3. Dans Cloud Shell, exécutez la commande suivante pour quitter le serveur Web.
pkill -f "http.server"
  1. Saisissez ensuite exit pour revenir à l'accueil de Cloud Shell. Une fois que vous avez terminé, continuons.

7. Créer le point de terminaison PSC vers googleapis

Pour activer la connectivité privée à notre point de terminaison de l'API Vertex, nous allons créer un point de terminaison Private Service Connect pour googleapis. Cela nous permettra d'utiliser une adresse IP privée que nous attribuons pour acheminer le trafic vers les googleapis dont nous avons besoin, en l'occurrence Vertex Gemini.

  1. Ouvrez Cloud Shell si ce n'est pas déjà fait. Nous allons créer une adresse IP pour le point de terminaison PSC et créer le point de terminaison Private Service Connect. Dans ce cas, nous allons utiliser 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. Valider
gcloud compute addresses list --filter="name=( 'anthro-ip' ...)"

gcloud compute forwarding-rules describe pscanthrovertex --global

8. Créer une entrée DNS manuelle pour googleapis

Vous pouvez créer une entrée DNS manuelle pour pointer vers le point de terminaison PSC à l'aide du DNS privé. Cela affecterait tous les réseaux que vous lui attribuez. Vous allez maintenant créer les éléments suivants :

  • Une zone DNS privée pour googleapis.com et l'associer au réseau anthropic-net.
  • Un enregistrement A mappant le domaine racine à l'adresse IP du point de terminaison Private Service Connect (192.168.255.230)
  • Un enregistrement CNAME générique pour rediriger tous les sous-domaines (par exemple, aiplatform.googleapis.com) vers l'enregistrement A racine
  1. Exécutez les commandes suivantes dans 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. Listez les ensembles d'enregistrements dans la zone pour confirmer que l'enregistrement A et le CNAME ont été créés correctement.
gcloud dns record-sets list --zone="googleapis-private"
  1. Dans la vue de la console, cela devrait ressembler à ceci. Vous devriez voir une configuration avec un enregistrement A et un enregistrement CNAME comme ceci : a51a8b8caa7a0f1e.png
  2. Nous vérifions ensuite la connectivité avec ces modifications sur anthro-vm.

9. Vérifier la connectivité du point de terminaison via l'adresse IP

Connectons-nous à Gemini à l'aide du point de terminaison privé.

  1. Dans Google Cloud Shell, connectez-vous en SSH à la nouvelle VM nommée anthro-vm.
gcloud compute ssh anthro-vm \
    --project=$projectid \
    --zone=us-east1-b \
    --tunnel-through-iap \
    -- -L 8080:localhost:8080
  1. Dans votre VM, vérifiez le chemin de connectivité vers aiplatform-pscanthrovertex.p.googleapis.com à l'aide de la commande dig. L'adresse IP du point de terminaison PSC 192.168.255.230 doit s'afficher.
dig aiplatform-pscanthrovertex.p.googleapis.com +noall +answer

Connectons-nous à Gemini à l'aide du point de terminaison privé.

  1. Effectuons maintenant un dig pour voir si nous pouvons nous connecter à l'API Vertex Gemini.
dig *-aiplatform.googleapis.com
  1. Le résultat doit ressembler à ceci (l'adresse sera différente). Notez que le chemin d'accès passe par les adresses IP du point de terminaison 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. En exécutant la commande ping Nous pouvons effectuer un test rapide. Remarque : Cette adresse IP est un point de terminaison PSC. Vos pings échoueront.
ping -c 2 aiplatform.googleapis.com
  1. Activez maintenant votre environnement venv :
source /opt/py-anthro-env/bin/activate
  1. Utilisons maintenant Python dans notre env. Cela crée un fichier Python star-me.py qui demande à Claude Opus 4.6 "Donne-moi une recette étape par étape pour faire un roti pour un débutant." puis prend la sortie et la transmet à Gemini 3.1 Pro, qui crée un résumé, et Gemini 3 Pro Image génère une image qu'il enregistre sur la VM.
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

Le script s'exécute dans une interface amusante et lance un serveur Web pour que vous puissiez afficher le résultat de l'image. Pour exécuter à nouveau le script, saisissez python3 star-me.py.

  1. Accédez à l'option d'aperçu Web dans Cloud Shell, puis sélectionnez "Prévisualiser sur le port 8080".

6dcb2bf9a08aacaf.png

  1. Sélectionnez cookingroti.png pour afficher l'image générée. (Exemple ci-dessous généré par l'IA) bcf43fffede275cb.png
  2. Dans Cloud Shell, exécutez la commande suivante pour quitter le serveur Web et revenir à la VM.
pkill -f "http.server"
  1. Saisissez ensuite exit pour revenir à l'accueil de Cloud Shell.

10. Félicitations

Félicitations ! Vous avez bien réussi à vous connecter à Anthropic Claude Opus 4.6 et Gemini 3.1 Pro sur Vertex en utilisant à la fois l'adresse de l'API publique et l'adresse privée du point de terminaison Private Service Connect pour Googleapis. Cette fonctionnalité peut étendre la connectivité des API privées à votre environnement sur site/autre cloud connecté via (Interconnect, Cross-Cloud Interconnect et VPC).

Effectuer un nettoyage

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

Étapes suivantes et informations supplémentaires

Pour en savoir plus sur la mise en réseau de Vertex AI

Codelab : Accéder au chat Gemini 3 Pro à l'aide du SDK Python via un point de terminaison Private Service Connect

Codelab : Créer des agents IA avec ADK : les bases

Atelier suivant

Continuez sur votre lancée avec Google Cloud et consultez ces autres ateliers Google Cloud Skills Boost :