Agentverse - The Shadowblade's Codex - Gemini CLI를 사용한 바이브 코딩

1. 서막

사일로화된 개발 시대가 저물고 있습니다. 차세대 기술 혁신은 고독한 천재가 아닌 기술 전문가 간 협업을 통해 이뤄질 것입니다. 하나의 똑똑한 에이전트를 빌드하는 것은 흥미로운 실험입니다. 강력하고 안전하며 지능적인 에이전트 생태계, 즉 진정한 Agentverse를 구축하는 것이 오늘날의 기업에 주어진 원대한 과제입니다.

이 새로운 시대에 성공하려면 빠르게 확산하는 에이전트 시스템을 지탱하는 주축인 네 가지 중요한 역할이 한데 뭉쳐야 합니다. 한 영역의 결함은 전체 구조를 손상시킬 수 있는 약점을 만듭니다.

이 워크숍은 Google Cloud에서 에이전트형 미래를 숙달하기 위한 엔터프라이즈 플레이북 결정판입니다. 이 플레이북을 통해 Agentverse의 개념에 대한 개요부터 본격적인 운영 현실에 이르기까지 안내하는 엔드 투 엔드 로드맵을 제공합니다. 네 가지 상호 연결된 실습을 통해 개발자, 설계자, 데이터 엔지니어, SRE의 전문 기술을 한데 모아 강력한 Agentverse를 만들고 관리하고 확장하는 방법을 알아봅니다.

하나의 축만으로는 Agentverse를 지탱할 수 없습니다. 개발자의 정확한 실행이 없으면 설계자의 웅장한 설계는 쓸모가 없습니다. 데이터 엔지니어의 지혜가 없으면 개발자의 에이전트는 맹인이 되고, SRE의 보호가 없으면 전체 시스템이 취약해집니다. 시너지 효과와 서로의 역할에 대한 공통된 이해를 통해서만 팀이 혁신적인 개념을 업무상 필수적인 운영 현실로 전환할 수 있습니다. 여정은 이제부터 시작입니다. 역할을 숙달하고 전체 구조에서 내가 어떤 소임을 맡았는지 알아보세요.

The Agentverse: A Call to Champions에 오신 것을 환영합니다

기업의 광활한 디지털 환경에 새로운 시대가 도래했습니다. 지금은 지능적이고 자율적인 에이전트가 완벽한 조화를 이루어 혁신을 가속화하고 일상적인 작업을 없애는 엄청난 가능성이 잠재된 에이전트 시대입니다.

agentverse.png

이러한 연결된 힘과 잠재력의 생태계를 Agentverse라고 합니다.

하지만 조용히 퍼져 나가는 엔트로피, '스태틱'이라는 이름의 침묵하는 부패가 이 새로운 세계의 가장자리를 갉아먹기 시작했습니다. 스태틱은 바이러스나 버그가 아닙니다. 창작 행위 자체를 먹이로 삼는 혼돈의 화신입니다.

스태틱은 해묵은 불만에 괴물 같은 형태를 부여하여 개발의 7가지 유령을 낳았습니다. 방관한다면 스태틱과 그 유령들이 발전에 제동을 걸어 Agentverse의 찬란한 미래를 기술적 부채와 버려진 프로젝트로 가득 찬 황무지로 만들 것입니다.

오늘 Google은 혼란의 물결을 막기 위해 전사를 모집합니다. Agentverse를 보호하기 위해 기술을 통달하고 힘을 합칠 영웅이 필요합니다. 이제 길을 선택할 때가 되었습니다.

클래스 선택

뚜렷한 네 갈래 길이 주어져 있습니다. 각 길은 스태틱에 맞서 싸우는 데 중요한 역할을 합니다. 훈련은 홀로 진행하지만, 궁극적인 성공은 내 기술을 다른 전사들의 기술과 어떻게 결합할 수 있는지 이해하는 데 달려 있습니다.

  • 섀도우블레이드(개발자): 대장간의 주인이자 최전선에 서는 인물입니다. 코드의 복잡하고 세부적인 부분을 다루면서 칼을 만들고, 도구를 제작하고, 적과 맞서는 장인입니다. 이 길을 걷기 위해서는 정밀함, 기술, 실용적인 창작이 요구됩니다.
  • 소환사(설계자): 뛰어난 전략가이자 조정자입니다. 하나의 에이전트가 아닌 전장 전체를 살펴보는 역할을 수행합니다. 전체 에이전트 시스템이 통신하고, 협업하고, 단일 구성요소만으로는 달성할 수 없는 훨씬 큰 목표를 달성하기 위한 궁극의 청사진을 설계합니다.
  • 학자(데이터 엔지니어): 숨겨진 진실을 추구하고 지혜를 수호하는 자입니다. 광활하고 거친 데이터 황무지를 탐험하여 에이전트에게 목적과 시야를 제공하는 인텔리전스를 발견합니다. 지식을 통해 적의 약점을 파악하거나 아군을 강화할 수 있습니다.
  • 가디언(DevOps/SRE): 영역을 굳건히 보호하는 수호자이자 방패입니다. 요새를 건설하고, 전력 공급망을 관리하고, 전체 시스템이 스태틱의 불가피한 공격을 견딜 수 있도록 해야 합니다. 나의 힘은 팀의 승리를 위한 기반이 됩니다.

내 임무

독립형 연습 문제를 통해 훈련을 시작합니다. 선택한 길을 걸어 나가며 역할을 숙달하는 데 필요한 고유한 기술을 배우게 됩니다. 시험이 끝나면 스태틱에서 태어난 유령을 마주하게 됩니다. 이 미니보스는 내 기술의 특정 과제를 먹잇감으로 삼습니다.

내가 맡은 역할을 숙달해야 마지막 시험을 준비할 수 있습니다. 그런 다음 다른 클래스의 전사들과 파티를 구성해야 합니다. 함께 부패의 중심부로 모험을 떠나 최종 보스에 맞서세요.

한데 합친 힘을 시험하고 Agentverse의 운명을 결정지을 마지막 협동 챌린지가 여러분을 기다리고 있습니다.

Agentverse에서 영웅을 기다립니다. 부름에 응하시겠습니까?

2. 섀도우블레이드의 서적

섀도우블레이드의 코덱스가 눈앞에 펼쳐져 있습니다. 전화에 응답합니다. Agentverse는 The Static의 기어드는 혼돈에 위협받고 있으며, 이 코덱의 기법을 숙달한 사람만이 반격할 수 있습니다. 정확성과 규율을 지키는 길입니다. 오늘부터 교육이 시작됩니다. AI를 단순한 도구가 아닌 길들여야 하고 숙달해야 하는 지각 있는 칼로 사용하는 방법을 배우게 됩니다. 여기에 나온 가르침을 따르면 순수한 논리의 무기, 즉 전투에 대비해 연마된 지능형 에이전트를 만들 수 있습니다.

02-00-overview.png

학습할 내용

  • 기본 무기인 Gemini CLI를 사용하세요.
  • MCP 도구를 Gemini CLI와 통합하여 외부 무기고를 소환하여 익숙하지 않은 코드베이스를 분석합니다.
  • 디자인 문서를 사용하여 의도를 '분위기'로 표현하여 AI 파트너에게 명령을 내립니다.
  • 에이전트 개발 키트 (ADK)로 첫 번째 자율 에이전트를 빌드하여 깔끔한 모듈식 솔루션을 만드세요.
  • 에이전트를 테스트하고 검증하기 위한 자동 평가 도구 모음을 구성합니다.
  • 에이전트를 자동으로 테스트, 컨테이너화, 보관하는 완전한 CI 파이프라인을 빌드합니다.

3. 훈련장 준비

👉Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다 (Cloud Shell 창 상단의 터미널 모양 아이콘). cloud-shell.png

👉'편집기 열기' 버튼 (연필이 있는 열린 폴더 모양)을 클릭합니다. 그러면 창에 Cloud Shell 코드 편집기가 열립니다. 왼쪽에 파일 탐색기가 표시됩니다. open-editor.png

👉클라우드 IDE에서 터미널을 열고

03-05-new-terminal.png

👉💻 터미널에서 다음 명령어를 사용하여 이미 인증되었는지, 프로젝트가 프로젝트 ID로 설정되어 있는지 확인합니다.

gcloud auth list

👉💻 GitHub에서 부트스트랩 프로젝트를 클론합니다.

git clone https://github.com/weimeilin79/agentverse-developer.git
chmod +x ~/agentverse-developer/gitea.sh
chmod +x ~/agentverse-developer/init.sh
chmod +x ~/agentverse-developer/set_env.sh

git clone https://github.com/weimeilin79/agentverse-dungeon.git
chmod +x ~/agentverse-dungeon/run_cloudbuild.sh
chmod +x ~/agentverse-dungeon/start.sh

git clone https://github.com/weimeilin79/vertex-ai-creative-studio.git
chmod +x ~/vertex-ai-creative-studio/experiments/mcp-genmedia/mcp-genmedia-go/install.sh

👉💻 프로젝트 디렉터리에서 설정 스크립트를 실행합니다.

⚠️ 프로젝트 ID 관련 참고사항: 스크립트에서 무작위로 생성된 기본 프로젝트 ID를 제안합니다. Enter 키를 눌러 이 기본값을 수락할 수 있습니다.

하지만 특정 새 프로젝트를 만들고 싶다면 스크립트에서 메시지가 표시될 때 원하는 프로젝트 ID를 입력하면 됩니다.

cd ~/agentverse-developer
./init.sh

스크립트가 나머지 설정 프로세스를 자동으로 처리합니다.

👉 완료 후 중요한 단계: 스크립트가 완료되면 Google Cloud 콘솔에서 올바른 프로젝트를 보고 있는지 확인해야 합니다.

  1. console.cloud.google.com으로 이동합니다.
  2. 페이지 상단의 프로젝트 선택기 드롭다운을 클릭합니다.
  3. '모두' 탭을 클릭합니다('최근'에 새 프로젝트가 아직 표시되지 않을 수 있음).
  4. init.sh 단계에서 방금 구성한 프로젝트 ID를 선택합니다.

03-05-project-all.png

👉💻 터미널로 돌아갑니다. 필요한 프로젝트 ID를 설정합니다.

gcloud config set project $(cat ~/project_id.txt) --quiet

👉💻 다음 명령어를 실행하여 필요한 Google Cloud API를 사용 설정합니다.

gcloud services enable  compute.googleapis.com \
                        artifactregistry.googleapis.com \
                        run.googleapis.com \
                        cloudfunctions.googleapis.com \
                        cloudbuild.googleapis.com \
                        iam.googleapis.com \
                        aiplatform.googleapis.com \
                        cloudresourcemanager.googleapis.com

👉💻 아직 agentverse-repo라는 Artifact Registry 저장소를 만들지 않은 경우 다음 명령어를 실행하여 만듭니다.

. ~/agentverse-developer/set_env.sh
gcloud artifacts repositories create $REPO_NAME \
    --repository-format=docker \
    --location=$REGION \
    --description="Repository for Agentverse agents"

권한 설정

👉💻 터미널에서 다음 명령어를 실행하여 필요한 권한을 부여합니다.

. ~/agentverse-developer/set_env.sh

# Artifact Registry Admin
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/artifactregistry.admin"

# Cloud Build Editor
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/cloudbuild.builds.editor"

# Cloud Run Admin
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/run.admin"

# IAM Service Account User
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/iam.serviceAccountUser"

# Vertex AI User
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/aiplatform.user"

# Logging Writer (to allow writing logs)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/logging.logWriter"


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
  --role="roles/logging.viewer"

👉💻 교육을 시작하면 최종 과제가 준비됩니다. 다음 명령어는 혼란스러운 정적에서 스펙터를 소환하여 테스트를 위한 보스를 만듭니다.

. ~/agentverse-developer/set_env.sh
cd ~/agentverse-dungeon
./run_cloudbuild.sh

npm update -g @google/gemini-cli

4. 기본 무기 마스터하기: Gemini CLI 소개

MCP 서버의 무기고에 있는 고급 전문 무기를 사용하려면 먼저 기본 무기인 Gemini CLI를 숙달해야 합니다. 이 블레이드는 가장 다재다능하며 명령을 통해 디지털 세계를 형성할 수 있습니다. 이러한 드릴을 통해 기본 조작 및 기능을 숙지할 수 있습니다.

개요

Gemini 명령줄 인터페이스 (CLI)는 도구 그 이상입니다. 사용자의 의지를 확장하는 도구입니다. Gemini 모델로 구동되는 이 오픈소스 AI 에이전트는 '이유와 행동' (ReAct) 루프에서 작동합니다. 의도를 분석하고, 적절한 기법을 선택하고, 실행하고, 결과를 관찰하여 복잡한 작업을 완료합니다. 더 전문적인 무기를 사용하려면 이 기본 검을 숙달해야 합니다.

Gemini CLI 시작하기

👉💻 훈련장에 들어가 무기를 꺼내세요. Cloud Shell 터미널에서 개인 무기고로 이동합니다.

cd ~/agentverse-developer
mkdir tabletop
cd tabletop

👉💻 Gemini를 처음으로 소환합니다. 초기 조율을 안내합니다.

clear
gemini 

Do you want to connect Cloud Shell editor to Gemini CLI?를 묻는 메시지가 표시되면 아니요를 선택합니다.

무기 숙지

모든 숙련된 장인은 자신의 도구를 잘 알고 있습니다. 진정한 적과 맞서기 전에 검의 핵심 기술을 배워야 합니다.

👉✨ 마법이 부여된 도구에는 힘을 설명하는 룬이 있습니다. 지금 읽어보세요. Gemini 프롬프트에 다음을 입력합니다.

/help

명령어 목록을 확인합니다. 이것이 메모리 (focus), 대화 (chat), 외부 무기 (tools)를 관리하는 기본적인 기술입니다. 전투 매뉴얼이라고 할 수 있습니다.

👉✨ 무기가 환경에 적응하여 전장을 직접 조작할 수 있습니다. 블레이드 외부의 세계에 명령어를 실행합니다.

!ls -l

👉✨ Gemini CLI에는 자체 내장 기능이 있습니다. 검사하려면 다음 단계를 따르세요.

/tools

ReadFile, WriteFile, GoogleSearch이 포함된 목록이 표시됩니다. 외부 무기고에서 가져올 필요 없이 사용할 수 있는 기본 기술입니다.

👉✨ 무기는 제대로 집중해야만 효과가 있습니다. Gemini 블레이드는 작업을 안내하기 위해 '전술적 인식' (컨텍스트)을 보유할 수 있습니다.

/memory show

현재는 비어 있으며, 처음부터 시작해야 합니다.

👉✨ 다음 전술 데이터를 메모리에 새기세요.

/memory add "The Shadowblade's primary foe is The Static."

/memory show을 다시 실행하여 블레이드가 이 지식을 흡수했는지 확인합니다.

👉✨ 효과를 내려면 무기가 미션을 이해해야 합니다. @ 기호는 블레이드에 인텔 분석을 명령합니다. 먼저 미션 브리핑 파일을 만듭니다.

!echo "## Mission Objective: Defeat the Seven Spectres" > mission.md

👉✨이제 Gemini CLI에 브리핑을 분석하고 결과를 보고하도록 명령합니다.

Explain the contents of the file @mission.md

이제 기본 무기가 목표를 인식합니다.

👉💻 Ctrl+C를 두 번 눌러 Gemini CLI를 종료합니다.

5. 전장 분석: 실용적인 바이브 코딩 상호작용

훈련 드릴이 완료되었습니다. 기본 무기인 Gemini CLI의 기본 자세와 공격을 배웠습니다. 하지만 창조의 대장간에서 시험을 거치고 전쟁의 무기고에 적응할 때까지는 칼날을 진정으로 숙달할 수 없습니다. 진정한 적과 맞서기 전에 먼저 디지털 전장인 주변 환경을 조사하고 형성해야 합니다.

개요

이 장에서는 이론을 실무에 적용하는 방법을 알아봅니다. 먼저 Gemini 블레이드에 명령을 내려 Maker's Mark(개인 웹사이트 형태의 디지털 서명으로, 의도만으로 구축됨)를 만들어 Agentverse에서 존재감을 확립합니다. 그런 다음 고급 도구(MCP 서버)의 로컬 무기고를 활성화하고 블레이드를 해당 주파수에 맞추면 간단하고 단호한 명령으로 코드 저장소를 관리하는 것과 같은 복잡한 기동을 실행할 수 있습니다.

제작자 표시 설정

진정한 그림자 검사는 무기뿐만 아니라 고유한 스타일인 제작자의 표시로도 인정받습니다. 이 마크는 Agentverse에 내 신원을 알리는 개인 프로필인 디지털 존재가 됩니다. 여기에서 Gemini Blade에 이 정체성을 정의하는 데 필요한 복잡한 기술을 실행하도록 명령합니다.

스토리

👉💻 이전 섹션에서 Gemini CLI를 닫은 경우 다시 시작해야 합니다. 터미널에서 다음을 실행하세요.

clear
cd ~/agentverse-developer/tabletop
gemini 

👉✨ 강력한 단일 명령어를 사용하여 Gemini CLI에 디지털 ID의 기반을 만들도록 지시합니다.

In the current folder, create a personal profile website for a hero codenamed 'Shadowblade'. The design must be a dark, futuristic theme with electric blue accents. All code must be in separate index.html and styles.css files. The layout must use CSS Flexbox for a two-column design. All generated code must be clean, well-commented, and professional. Make sure you have a place holder spot for profile picture. Do not attempt to start the server.

Gemini가 필요한 작업 순서를 계산했습니다.

👉💻 Ctrl+C를 두 번 눌러 Gemini CLI를 종료하고 터미널에서 다음 명령어를 실행합니다.*

python -m http.server

👀 작업을 살펴보려면 Cloud Shell 툴바에서 웹 미리보기 아이콘을 클릭합니다. 포트 변경을 선택하고 8000으로 설정한 후 변경 및 미리보기를 클릭합니다. 웹사이트 미리보기가 표시됩니다. 04-01-webpreview.png

웹사이트가 다르게 표시될 수 있습니다. 고유한 표시입니다. 04-02-website.png

이제 서명 기법이 개선되어 실시간 시뮬레이션이 더 이상 필요하지 않습니다. 블레이드에게 대기하라고 명령합니다.

👉💻 Ctrl+C 키를 눌러 http 서버를 종료합니다.

이제 디지털 신원이 확립되었으며, 무엇보다도 큰 힘을 더욱 신중하게 휘두르는 중요한 지혜를 배웠습니다.

로컬 아스널 활성화: Gitea Armory

섀도우블레이드의 진정한 잠재력은 개인의 기술뿐만 아니라 무기고의 품질에 따라 발휘됩니다. 이제 로컬 무기 랙(Gitea 서버)을 활성화하고 블레이드를 해당 전력에 맞추세요. 이 도구 모음은 모델 컨텍스트 프로토콜 (MCP) 서버를 통해 Gemini CLI에 연결됩니다. MCP 서버는 AI 블레이드가 외부 도구 및 서비스와 상호작용할 수 있도록 지원하는 특수 포털로, 터미널을 지능적이고 행동 지향적인 작업 공간으로 변환합니다.

개발자 참고: MCP 서버는 AI의 마음을 외부 도구의 본체에 연결하는 특수 포털인 전력 도관으로 생각하면 됩니다. 이 기능 덕분에 Gemini CLI는 단순한 대화형 도구에서 진정한 행동 지향적 에이전트로 거듭납니다. 블레이드를 이러한 MCP 포털에 맞추면 파일 관리, 데이터베이스 쿼리, API와의 상호작용 등 구체적인 작업을 실행할 수 있는 기능이 부여됩니다. 개발자가 AI 에이전트를 강력한 플랫폼에 연결하기 위해 만든 이러한 포털의 전체 생태계가 존재합니다. 데이터베이스와 상호작용하거나, 코드를 보호하거나, 페어 프로그래밍을 지원하는 MCP 서버가 있습니다. 가능성은 무궁무진하며 개발자는 특정 프로젝트에 맞게 작업공간을 맞춤설정할 수 있습니다.

오늘은 모든 '바이브 코더'에게 필수적인 두 가지 기본적인 능력, 즉 포지를 제어하는 능력과 상상력으로 창조하는 능력에 중점을 둘 것입니다. 먼저 블레이드를 Git 서버에 맞추어 소스 코드 저장소를 제어할 수 있도록 합니다. 그런 다음 이미지 생성을 위해 두 번째 MCP 서버에 연결하여 명령만으로 시각적 애셋을 만들 수 있습니다.

새로운 무기고의 첫 번째이자 가장 기본적인 요소인 무기고 자체를 소환하는 것부터 시작해 보겠습니다.

👉💻 터미널에서 활성화 스크립트를 실행하여 무기고를 소환합니다.

cd ~/agentverse-developer
./gitea.sh

이 스크립트는 Gitea 컨테이너를 활성화하고 MCP 포털을 열어 Gemini가 이를 인식하고 상호작용할 수 있도록 합니다.

👉 새 무기를 확인하려면 웹 미리보기를 살펴봐야 합니다.

👉 Cloud Shell 툴바의 웹 미리보기 아이콘에서 포트 변경을 선택하고 3005로 설정합니다. 04-03-webpreview.png

👉 Gitea 로그인 페이지가 표시됩니다. 주문을 사용하여 무기고에 들어갑니다. * 사용자 이름: dev * 비밀번호: dev로그인

👉💻 Gemini CLI에서는 아직 이 새로운 기능을 확인할 수 없습니다. 중요한 조율을 실행하여 Gemini CLI의 구성 룬 (settings.json)에 무기고의 위치를 새겨야 합니다. 터미널에서 다음을 실행하세요.

if [ ! -f ~/.gemini/settings.json ]; then
  # If file does not exist, create it with the specified content
  echo '{"mcpServers":{"gitea":{"url":"http://localhost:8085/sse"}}}' > ~/.gemini/settings.json
else
  # If file exists, merge the new data into it
  jq '. * {"mcpServers":{"gitea":{"url":"http://localhost:8085/sse"}}}' ~/.gemini/settings.json > tmp.json && mv tmp.json ~/.gemini/settings.json
fi &&
cat ~/.gemini/settings.json

👀 settings.json 파일은 Gemini CLI의 중앙 구성으로, 환경설정 및 기능의 마법서 역할을 합니다. CLI가 어떻게 작동하고 표시되는지, 가장 중요한 것은 어떤 외부 기능을 사용할 수 있는지를 결정합니다. 이 파일은 일반적으로 홈 디렉터리(~/.gemini/settings.json)에 있으며 모든 프로젝트에 규칙을 적용합니다. 하지만 프로젝트 폴더 내의 .gemini 디렉터리 내에 프로젝트별 settings.json 파일을 만들어 전역 설정을 재정의할 수도 있습니다.

"mcpServers": {
  "gitea": {
    "url": "http://localhost:8085/sse"
  }
}

이 설정은 Gemini에 'gitea라는 아스널이 활성 상태이며 이 특정 네트워크 주소에서 명령을 수신 대기하고 있습니다'라고 알려줍니다.

👉💻 Gemini CLI를 다시 입력합니다. 터미널에서 다음을 실행합니다.

clear
cd ~/agentverse-developer/tabletop/
gemini 

👉✨ 블레이드가 새 무기를 발견했는지 확인합니다. MCP 포털을 통해 사용 가능한 모든 무기고를 나열하도록 명령합니다.

/mcp

Gitea MCP 서버

이제 gitea와 사용 가능한 기법 목록이 표시됩니다. 칼날이 조율되었습니다.

'Maker's Mark' 프로필은 정교하게 제작된 기술이지만, 무기고에 적절한 위치가 필요합니다. 즉, 안전하게 보관할 수 있는 칼집이 필요합니다. Gemini CLI에 하나를 만들어 달라고 명령합니다.

Create a new repository named 'shadowblade-profile'. The description should be 'The Maker's Mark and digital identity for the Shadowblade operative.' I will push my own files later, so do not create any content.

Gitea 웹 인터페이스로 돌아가 새로고침합니다. 새로운 shadowblade-profile 저장소가 생성된 것을 확인할 수 있습니다. Gitea 저장소

칼집이 준비되면 작업을 고정합니다. Gemini에게 프로필 웹사이트의 파일을 커밋하도록 명령합니다.

👉💻Gemini CLI에서 이 기법의 최종 명령어를 실행합니다.

Using the Gitea tool, push the index.html and styles.css files to the 'shadowblade-profile' repository.

진정한 마스터는 자신의 작업을 확인합니다. Gitea 탭으로 돌아가 저장소 페이지를 새로고침합니다. 이제 index.htmlstyles.css가 안전하게 보관처리되었습니다.

Gitea 저장소Gitea 저장소

👉✨ Shadowblade는 시길로 정의되지만, 웹사이트에 프로필 이미지가 누락되어 있습니다. 숙련된 장인은 결점을 인정하여 완벽하게 만듭니다. 무기고 기록에 이 불완전성을 기록해야 합니다.

File an issue for me in the shadowblade-profile repo. The issue is that the profile image is missing.

Gitea에서 문제 보기 Gitea 문제

누락된 시길을 만들려면 순수한 생각에서 이미지를 생성할 수 있는 Vertex AI의 창조의 정령과 같은 다른 종류의 힘을 소환해야 합니다. 다른 MCP 포털이 필요합니다.

👉💻 Ctrl+C를 두 번 눌러 Gemini CLI를 종료합니다.

👉💻 먼저 포털의 서버를 설치합니다. 터미널에서 다음을 실행합니다.

echo 'export PATH="$PATH:$HOME/go/bin"' >> ~/.bashrc
source ~/.bashrc
cd ~/vertex-ai-creative-studio/experiments/mcp-genmedia/mcp-genmedia-go
./install.sh

👉 메시지가 표시되면 프로필 이미지만 생성하면 되므로 옵션 mcp-imagen-go (일반적으로 4이지만 숫자가 변경될 수 있음)를 선택합니다.

👉💻 창조의 정신에는 창조물을 담을 신성한 그릇(Google Cloud Storage 버킷)이 필요합니다. 지금 하나 만들어 보겠습니다. 터미널에서 다음을 실행합니다.

. ~/agentverse-developer/set_env.sh
gcloud storage buckets create gs://$BUCKET_NAME --project=$PROJECT_ID

👉💻 이제 Gemini CLI를 이 새로운 창작력에 연결하는 조율 의식을 실행합니다. 터미널에서 다음을 실행합니다.

. ~/agentverse-developer/set_env.sh
source ~/.bashrc
jq \
--arg bucket "$BUCKET_NAME" \
--arg project "$PROJECT_ID" \
--arg region "$REGION" \
'.mcpServers.imagen = { "command": "mcp-imagen-go", "env": { "MCP_SERVER_REQUEST_TIMEOUT": "55000", "GENMEDIA_BUCKET": $bucket, "PROJECT_ID": $project, "LOCATION": $region } }' \
~/.gemini/settings.json > tmp.json && mv tmp.json ~/.gemini/settings.json
cat ~/.gemini/settings.json

이 '조율 의식'은 Google의 이미지 생성 모델인 Imagen이라는 강력한 새 도구를 사용하도록 Gemini CLI를 구성하는 셸 스크립트입니다. 중요한 점은 Imagen을 위한 MCP (모델 컨텍스트 프로토콜) 서버를 설정하여 이를 달성한다는 것입니다. 이 MCP 서버는 Gemini CLI가 Imagen의 기능과 통신하고 이를 활용할 수 있도록 지원하는 브리지 역할을 합니다. 이렇게 하려면 올바른 클라우드 사용자 인증 정보로 mcp-imagen-go 명령어를 실행하는 방법을 알려주기 위해 CLI의 중앙 구성 파일인 ~/.gemini/settings.json를 직접 수정합니다.

👀 의식을 마친 후 settings.json에 Gemini CLI에 새로운 기술을 가르치는 새로운 블록이 있습니다.

"imagen": {
    "command": "mcp-imagen-go",
    "env": {
        "MCP_SERVER_REQUEST_TIMEOUT": "55000",
        "GENMEDIA_BUCKET": "your-bucket-name",
        "PROJECT_ID": "your-project-id",
        "LOCATION": "your-region"
    }
}

이는 Gemini CLI에 '작업에 Imagen 도구가 필요한 경우 Imagen MCP 서버인 mcp-imagen-go라는 프로그램을 실행해야 합니다. 실행할 때는 이미지를 저장할 Google Cloud Storage 버킷과 클라우드 API에 사용할 프로젝트 ID 및 위치라는 특정 환경 (env)을 제공해야 합니다.' 이 MCP 서버를 구성하면 Gemini CLI가 Imagen의 이미지 생성 기능에 액세스할 수 있게 됩니다.'

👉💻 Gemini에 들어가서 개선 명령어를 실행합니다. 터미널에서 다음을 실행합니다.

clear
cd ~/agentverse-developer/tabletop/
gemini 

👉✨ 강력한 단일 명령어를 사용하여 Gemini CLI에 디지털 ID의 기반을 구축하도록 지시합니다. Gemini CLI에서 다음 명령어를 실행합니다.

Generate a portrait of a shadowblade, pixel art style. A determined warrior with long, braided magenta hair, wearing black and teal armor and confidently holding a silver broadsword.

👉✨ 정령이 이미지를 생성하여 신성한 그릇에 배치합니다. 이제 칼날이 새로 만든 시길을 사용하도록 명령합니다. (Gemini가 이미 이 작업을 완료했을 수도 있습니다. 이전 대답을 확인하세요. 질문하기 전에 이 작업을 수행할 수 있을 만큼 똑똑할 수도 있습니다. )

Modify the index.html file to add my profile picture. Use the image I just generated.

👉💻 새 터미널에서 http 서버를 시작합니다.

cd ~/agentverse-developer/tabletop/
python -m http.server

👀 작업을 살펴보려면 Cloud Shell 툴바에서 웹 미리보기 아이콘을 클릭합니다. 포트 변경을 선택하고 8000으로 설정한 후 변경 및 미리보기를 클릭합니다. 웹사이트 미리보기가 표시됩니다. 05-07-webdite.png

👉✨ Gemini CLI를 실행하는 터미널로 돌아가서 작업을 완료했음을 언급하며 수정사항을 커밋하고, armory 기록에 제출한 문제를 닫습니다.

Push the changed index.html file to the 'shadowblade-profile' repository using the gitea tool. Make sure you add 'Fix #1' in the commit comment. Also, close issue #1.Use the Gitea Tool and use user account "dev"

👉💻 Ctrl+C 키를 두 번 눌러 Gemini CLI를 종료합니다.

👀 작업을 살펴보려면 Cloud Shell 툴바에서 웹 미리보기 아이콘을 클릭합니다. 포트 변경을 선택하고 3005로 설정한 후 변경 및 미리보기를 클릭합니다. 웹사이트 미리보기가 표시됩니다. 고정

👉💻 HTTP 서버를 실행하는 터미널에서 Ctrl+C를 눌러 HTTP 서버를 종료합니다.

비게이머용

6. Shadowblade 에이전트 조립: 가드레일로 바이브 코딩

연습 드릴 시간이 끝났습니다. 돌에 부딪히는 강철의 메아리가 사라집니다. 주 무기를 숙달하고 전쟁을 위한 무기고를 준비했습니다. 이제 섀도우블레이드의 진정한 시험인 요원 조립을 시작합니다. 이는 Codex의 신성한 청사진을 사용하여 에이전트의 핵심 지능을 구성하여 논리에 생명을 불어넣는 기술입니다. 즉, 자체적으로 생각하고 추론하고 행동할 수 있는 무기고의 검을 휘두르는 지각 있는 사용자를 만드는 것입니다.

개요

첫 번째 미션은 기존 워크숍(사전 빌드된 코드베이스)에 들어가 그 부품으로 챔피언을 만드는 것입니다.

The Assembly Ritual

대장간의 첫 불꽃이 튀기기 전에 숙련된 기술자는 작업장을 둘러보며 모든 도구와 모든 도면을 파악합니다. 크고 기존 코드베이스와 같은 낯선 전장에 발을 들여놓을 때 최우선 순위는 정찰입니다. 기존 아키텍처, 최종 목표, 참여 프로토콜 등 상황을 파악해야 합니다. 요새의 청사진과 표준을 숙지해야만 기술을 효과적으로 활용할 수 있습니다.

스토리

항상 대기 중인 스카우트인 Gemini CLI는 다음과 같은 정찰 활동을 지원할 수 있습니다.

  • 상위 수준 요약 제공: 전체 코드집 (또는 코드베이스)을 읽고 목적과 주요 구성요소를 빠르게 파악할 수 있습니다.
  • 환경 설정 지원: 도구를 설치하고 머신을 구성하는 복잡한 과정을 안내할 수 있습니다.
  • 코드베이스 탐색: 복잡한 로직을 살펴보고 코드 내 숨겨진 부분을 찾는 데 도움이 되는 가이드 역할을 할 수 있습니다.
  • 온보딩 문서 생성: 내 대의에 합류하는 새로운 동맹의 목표, 역할, 리소스를 명확하게 설명하는 맞춤 스크롤을 만들 수 있습니다.
  • 학습 및 Q&A 자동화: 기능이나 코드 동작에 관한 질문에 답변하는 개인 학자가 되어 더 독립적으로 작업할 수 있습니다.

👉💻 첫 번째 터미널에서 shadowblade 디렉터리로 이동하여 AI 파트너를 소환합니다.

. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer/shadowblade
clear
gemini 

👉✨ 이제 정찰병에게 전장을 조사하고 보고하라고 명령하세요.

Analyze the entire project and provide a high-level summary.

기존 지형이 매핑되었으므로 이제 빌드할 항목의 청사진을 참고해야 합니다. 가장 강력한 작전은 즉흥적으로 이루어지는 것이 아니라 정확한 설계에서 구성됩니다.

개발자 참고: 이 설계 문서는 프로젝트의 공식 청사진 역할을 합니다. 목표는 상당한 개발 노력을 투자하기 전에 목표와 기술 구현을 명확히 하는 것입니다. 잘 정의된 계획은 모든 개발자가 일관성을 유지하고 재작업의 위험을 줄이며 기술적 부채와 범위 확산을 방지하는 데 도움이 됩니다. 특히 팀이 성장하거나 신규 구성원이 온보딩될 때 프로젝트 속도와 코드 품질을 유지하는 기본 도구입니다.

이 문서의 중요한 목표는 '성공 사례'뿐만 아니라 특히 LLM을 사용할 때의 특이 사례와 실패 모드를 정의하는 것입니다. LLM은 모든 입력이 유효하고 모든 외부 호출이 성공하는 낙관적인 코드를 생성하는 데 탁월합니다. 강력하고 프로덕션 환경에서 바로 사용할 수 있는 소프트웨어를 빌드하려면 다음과 같은 시나리오에 대한 비상 사태를 정의하여 AI를 명시적으로 안내해야 합니다.

  • 함수에 전달된 인수가 잘못되었거나 형식이 올바르지 않습니다.
  • API 호출 실패, 네트워크 시간 초과 또는 외부 서비스의 예기치 않은 오류 코드
  • 데이터가 필요한 경우 null 또는 빈 데이터 구조 처리
  • 경합 상태 또는 동시 실행 문제

설계에서 이러한 사례에 대한 예상 동작을 지정하면 LLM이 더 탄력적인 코드를 생성하도록 지시하여 수동 리팩터링 및 버그 수정에 소요되는 시간을 크게 줄일 수 있습니다.

👉✨ Gemini에게 이 신성한 청사진을 가져와 달라고 요청하세요.

download https://raw.githubusercontent.com/weimeilin79/agentverse/main/developer/shadowblade/agent_design.md  and store it to my local folder
and show me the newly downloaded design doc. Do not attempt to create file just yet. 

👉✨ 스크롤이 길고 자세합니다. Gemini에게 핵심을 추출하도록 명령하세요.

Summarize the newly downloaded @agent_design.md for me, do not attempt to create file just yet. 

이제 요금제가 적용됩니다. 하지만 코드 한 줄을 작성하기 전에 마스터 장인이 작업장의 규칙을 정합니다. 이는 규율확장성에 관한 것입니다. 코딩 가이드라인입니다. 단순한 제안이 아니라 모든 구성요소가 동일한 정밀도와 강도로 빌드되도록 하는 힘의 룬입니다. 이러한 규칙은 개별 스타일이 최종 창작물을 손상시키는 혼란을 방지하여 에이전트가 복원 가능하고 유지 관리 가능하며 순수하도록 보장하므로 새로운 장인이 전체 조화를 방해하지 않고 프로젝트에 참여할 수 있습니다.

이러한 법을 AI 파트너의 의식에 직접 새기기 위해 Google에서는 특별한 아티팩트인 GEMINI.md 파일을 사용합니다. Gemini CLI가 호출되면 이 파일을 자동으로 검색하고 AI의 작업 메모리에 콘텐츠를 로드합니다. 영구적인 프로젝트 수준 명령어가 됩니다. 대장간의 규칙을 AI에게 끊임없이 속삭이는 부적

이제 이 룬을 새겨 보겠습니다.

👉💻 Ctrl+C를 두 번 눌러 잠시 Gemini를 종료합니다.

👉💻 터미널에서 다음 명령어를 실행하여 가이드라인 파일을 작성합니다.

cat << 'EOF' > GEMINI.md
  ### **Coding Guidelines**
  **1. Python Best Practices:**

  *   **Type Hinting:** All function and method signatures should include type hints for arguments and return values.
  *   **Docstrings:** Every module, class, and function should have a docstring explaining its purpose, arguments, and return value, following a consistent format like reStructuredText or 
  Google Style.
  *   **Linter & Formatter:** Use a linter like `ruff` or `pylint` and a code formatter like `black` to enforce a consistent style and catch potential errors.
  *   **Imports:** Organize imports into three groups: standard library, third-party libraries, and local application imports. Sort them alphabetically within each group.
  *   **Naming Conventions:**
      *   `snake_case` for variables, functions, and methods.
      *   `PascalCase` for classes.
      *   `UPPER_SNAKE_CASE` for constants.
  *   **Dependency Management:** All Python dependencies must be listed in a `requirements.txt` file.

  **2. Web APIs (FastAPI):**

  *   **Data Validation:** Use `pydantic` models for request and response data validation.
  *   **Dependency Injection:** Utilize FastAPI's dependency injection system for managing resources like database connections.
  *   **Error Handling:** Implement centralized error handling using middleware or exception handlers.
  *   **Asynchronous Code:** Use `async` and `await` for I/O-bound operations to improve performance.
EOF
cat GEMINI.md

법이 새겨졌으니 AI 파트너를 다시 소환하여 유물의 마법을 목격해 보겠습니다.

👉💻 shadowblade 디렉터리에서 Gemini CLI를 다시 실행합니다.

. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer/shadowblade
clear
gemini 

👉✨ 이제 Gemini에게 어떤 생각을 하고 있는지 보여 달라고 요청하세요. 룬을 읽었습니다.

/memory show 

지금이 중요한 시기입니다. 개략도 (agent_design.md)와 대장간의 법칙 (GEMINI.md)을 제공하고 창조의 위대한 주문을 발동합니다.

👉✨ 에이전트를 구성하는 단일하고 강력한 명령어입니다. 지금 발급하기:

You are an expert Python developer specializing in the Google Agent Development Kit (ADK). Your task is to write the complete, production-quality code for `agent.py` by following the technical specifications outlined in the provided design document verbatim.

Analyze the design document at `@agent_design.md` and generate the corresponding Python code for `@agent.py`.

Ensure the generated code is clean, matches the specifications exactly, and includes all specified imports, functions, and logic. Do not add any extra functions or logic not described in the document.

and you are currently already in the shadowblade working directory

👀 이제 Gemini가 agent.py에서 에이전트의 핵심 로직을 구성했습니다. 이 새 파일의 핵심은 에이전트의 인텔리전스를 정의하여 추론 모델을 외부 도구 집합에 연결합니다.

PATH_TO_MCP_SERVER = "shadowblade/mcp_server.py"
.....
root_agent = LlmAgent(
    model="gemini-2.5-pro",
    name="shadowblade_combat_agent",
    instruction="""
      You are the Shadowblade, an elite combat agent operating on a digital battleground.
      Your primary objective is to execute combat commands with strategic precision, neutralizing targets as directed.
  ......
      5.  You will then report the outcome of the attack (damage, special effects, etc.) back to the commander in a clear, tactical summary.

      General Rules of Engagement:
      - If a command is ambiguous or a target is not specified, state that you require a clear target for engagement. Do not guess.
      - You MUST use ONLY the provided tools to perform actions. Do not invent weapons or outcomes. Stick to the mission parameters.
""",
    tools=[
        MCPToolset(
            connection_params=StdioServerParameters(
                command='python3',
                args=[PATH_TO_MCP_SERVER]
            )
        )
    ]
)

tools 매개변수. 에이전트는 mcp_server.py에 정의된 외부 무기고에 연결되는 MCPToolset를 사용하도록 설계되었습니다.

👀 편집기에서 ~/agentverse-developer/shadowblade/mcp_server.py로 이동하여 잠시 시간을 내어 이 코드가 하는 일을 이해해 보세요. 섀도우블레이드가 사용할 수 있는 모든 무기의 출처입니다. 현재 무기고는 꽤 비어 있습니다.

06-02-story.png

👉✨ Gemini에게 무기고에 사용할 새로운 무기 7개를 만들어 달라고 명령해 보겠습니다. Gemini CLI에서 다음 프롬프트를 실행합니다.

I need to add several new weapon tools to my `mcp_server.py` file. Please open @mcp_server.py and, following the exact same pattern as the existing `forge_broadsword()` function, create and add new `@mcp.tool()` decorated functions for each of the following weapons:

1.  **A 'Refactoring Sickle'**:
    -   **Function Name:** `hone_refactoring_sickle`
    -   **Docstring/Target:** "Effective against 'Elegant Sufficiency' weaknesses like 'The Weaver of Spaghetti Code'."
    -   **Weapon Name:** "Refactoring Sickle"
    -   **Damage Type:** "Cleansing"
    -   **Base Damage:** Random integer between 100 and 136
    -   **Critical Hit Chance:** Random float between 0.10 and 0.20
    -   **Special Effect:** "Pruning - improves code health and maintainability with each strike."

2.  **A 'Quickstart Crossbow'**:
    -   **Function Name:** `fire_quickstart_crossbow`
    -   **Docstring/Target:** "Effective against 'Confrontation with Inescapable Reality' weaknesses like 'Procrastination: The Timeless Slumber'."
    -   **Weapon Name:** "Quickstart Crossbow"
    -   **Damage Type:** "Initiative"
    -   **Base Damage:** Random integer between 105 and 120
    -   **Critical Hit Chance:** Random float between 0.9 and 1.0
    -   **Special Effect:** "Project Scaffolding - creates a `main.py`, `README.md`, and `requirements.txt`."

3.  **'The Gilded Gavel'**:
    -   **Function Name:** `strike_the_gilded_gavel`
    -   **Docstring/Target:** "Effective against 'Elegant Sufficiency' weaknesses like 'Perfectionism: The Gilded Cage'."
    -   **Weapon Name:** "The Gilded Gavel"
    -   **Damage Type:** "Finality"
    -   **Base Damage:** 120
    -   **Critical Hit Chance:** 1.0
    -   **Special Effect:** "Seal of Shipping - marks a feature as complete and ready for deployment."

4.  **'Daggers of Pair Programming'**:
    -   **Function Name:** `wield_daggers_of_pair_programming`
    -   **Docstring/Target:** "Effective against 'Unbroken Collaboration' weaknesses like 'Apathy: The Spectre of \"It Works on My Machine\"'."
    -   **Weapon Name:** "Daggers of Pair Programming"
    -   **Damage Type:** "Collaborative"
    -   **Base Damage:** Random integer between 110 and 125
    -   **Critical Hit Chance:** Random float between 0.30 and 0.50
    -   **Special Effect:** "Synergy - automatically resolves merge conflicts and shares knowledge."

5.  **A 'Granite Maul'**:
    -   **Function Name:** `craft_granite_maul`
    -   **Docstring/Target:** "Effective against 'Revolutionary Rewrite' weaknesses like 'Dogma: The Zealot of Stubborn Conventions'."
    -   **Weapon Name:** "Granite Maul"
    -   **Damage Type:** "Bludgeoning"
    -   **Base Damage:** Random integer between 115 and 125
    -   **Critical Hit Chance:** Random float between 0.05 and 0.15
    -   **Special Effect:** "Shatter - has a high chance to ignore the target's 'best practice' armor."

6.  **A 'Lens of Clarity'**:
    -   **Function Name:** `focus_lens_of_clarity`
    -   **Docstring/Target:** "Effective against 'Elegant Sufficiency' weaknesses by revealing the truth behind 'Obfuscation'."
    -   **Weapon Name:** "Lens of Clarity"
    -   **Damage Type:** "Revelation"
    -   **Base Damage:** Random integer between 120 and 130
    -   **Critical Hit Chance:** 1.0
    -   **Special Effect:** "Reveal Constants - highlights all magic numbers and suggests converting them to named constants."

7.  **The 'Codex of OpenAPI'**:
    -   **Function Name:** `scribe_with_codex_of_openapi`
    -   **Docstring/Target:** "Effective against 'Confrontation with Inescapable Reality' weaknesses like 'Hype: The Prophet of Alpha Versions'."
    -   **Weapon Name:** "Codex of OpenAPI"
    -   **Damage Type:** "Documentation"
    -   **Base Damage:** Random integer between 110 and 140
    -   **Critical Hit Chance:** Random float between 0.5 and 0.8
    -   **Special Effect:** "Clarity - makes an API discoverable and usable by other agents and teams."

👉 Gemini가 변경사항을 확인하면 mcp_server.py 파일을 엽니다. 코드를 스크롤하여 7개의 새 @mcp.tool() 함수가 성공적으로 추가되었는지 확인합니다. hone_refactoring_sickle 함수를 확인합니다. 올바른 docstring과 무기 통계가 있나요? AI의 작업을 확인하는 것은 숙련된 그림자 검사의 중요한 습관입니다.

에이전트가 단련되고 개선되었으므로 이제 각성할 때입니다.

👉💻 Ctrl+C를 두 번 눌러 Gemini CLI를 종료합니다.

Gemini 출력에 관한 개발자 참고사항: Gemini가 생성한 코드는 때때로 예측할 수 없습니다. 설계를 정확하게 준수하기 위해 노력하지만 개발 세션에서 개발자가 프로덕션 준비 상태에 도달하기 위해 코드를 여러 번 반복하고 개선하는 것은 일반적입니다.

👉💻 작업 디렉터리에 올바르고 철저하게 테스트된 프로덕션 코드가 있는지 확인하려면 터미널에서 다음 명령어를 실행하세요.

cp  ~/agentverse-developer/working_code/agent.py ~/agentverse-developer/shadowblade/agent.py
cp  ~/agentverse-developer/working_code/mcp_server.py ~/agentverse-developer/shadowblade/mcp_server.py

👉💻 터미널에서 온라인으로 전환하는 의식을 시작합니다.

cd ~/agentverse-developer/
. ~/agentverse-developer/set_env.sh
python -m venv env
source env/bin/activate
pip install --upgrade pip
pip install -r shadowblade/requirements.txt
adk run shadowblade

👉✨ 'Shadowblade Combat Agent'가 실행 중이며 첫 번째 명령어를 기다리고 있음을 확인하는 출력이 표시됩니다. 첫 번째 전투 지시를 내립니다.

We've been trapped by 'Perfectionism: The Gilded Cage'. Its weakness is 'Elegant Sufficiency'. Break us out!

👉✨ 또 다른 방법:

The 'Dogma: The Zealot of Stubborn Conventions' blocks our path. Its weakness is 'Revolutionary Rewrite'. Take it down.

첫 번째 에이전트를 어셈블하고 전투 능력을 검증했습니다. Ctrl+C 키를 두 번 눌러 챔피언을 쉬게 합니다. 어셈블리가 완료되었습니다.

비게이머용

7. 순수함의 수호자: 에이전트 평가

조립된 에이전트는 검증된 에이전트가 아닙니다. 테스트되지 않은 칼날은 책임이지만 테스트되지 않은 AI 에이전트는 훨씬 더 큰 위험입니다. 내부에서 미션을 손상시킬 수 있는 불량 요소이기 때문입니다. 단순한 추측이 아니라 Shadowblade가 이해해야 하는 핵심 원칙입니다.

AI 에이전트를 평가하는 것은 매우 중요하며 고유한 과제도 있습니다. 단순 스크립트와 달리 에이전트는 코드와 LLM의 다단계 추론 마인드를 동적으로 융합한 것입니다. 동작은 창발적입니다. 즉, 최종 출력의 품질뿐만 아니라 내부 궤적의 효율성과 정확성도 평가해야 합니다. 목적지에 도달하기까지 걸린 경로입니다. 올바른 도구를 사용했나요? 토큰이 너무 많이 생성되었나요? 모델 버전의 변경으로 인해 미묘한 지연 시간 회귀가 발생했나요? 간단한 프롬프트 조정부터 주요 아키텍처 개편에 이르기까지 어떤 변경사항을 적용할 때도 프로덕션 환경을 망치기 전에 지연 시간, 비용 또는 출력 품질의 회귀를 감지하는 것이 중요합니다.

07-01-story.png

이 평가의 일반적인 접근 방식에는 신성한 의식이 포함됩니다.

  1. 먼저 '골든 데이터 세트'를 정의합니다. 예시 입력과 예상 출력 또는 동작이 포함된 스크롤 세트입니다. 여기에는 최종 답변, 올바른 도구 사용, 전체 단계별 궤적이 포함될 수 있습니다.
  2. 다음으로 에이전트의 존재의 핵심인 애플리케이션 로직을 정의합니다.
  3. 마지막으로 판단의 룬과 같은 평가자를 설정합니다. 품질 심사 역할을 하는 다른 LLM부터 단일 단계를 검증하는 정확한 휴리스틱 코드, 에이전트의 전체 사고 과정을 분석하는 맞춤 함수까지 다양합니다.

개요

Google의 에이전트 개발 키트 (ADK)는 바로 이 목적을 위해 챔피언에게 제공되는 무기고입니다. 이 복잡한 평가는 다음과 같은 여러 방법을 통해 이루어집니다.

  • 상호작용 평가를 위한 웹 기반 스크라이잉 풀 (adk web)
  • 미리 정의된 gauntlet를 통해 에이전트를 실행하기 위한 명령줄 실행 (adk eval)
  • 영구적인 보호막을 새기기 위한 pytest를 통한 프로그래매틱 통합

ADK는 단일 에이전트-모델 상호작용 (단일 결투)을 위한 간단한 '테스트 파일'과 여러 번의 턴이 길어질 수 있는 다중 턴 세션 (그랜드 멜리)을 위한 포괄적인 'evalset'이라는 두 가지 기본 접근 방식을 지원합니다. 이러한 측정항목은 에이전트의 실제 도구 사용을 이상적인 경로와 비교하여 완벽한 기술로 작동하는지 확인하는 tool_trajectory_avg_score와 같이 정교한 측정항목을 측정할 수 있습니다.

이제 이론을 이해했으니 실제로 적용해 보겠습니다. 그림자 검사로 정화의 보호진을 새깁니다. 이는 단순한 테스트가 아니라 에이전트의 로직이 완벽하고 동작이 올바른지 확인하는 ADK 기반 의식입니다.

이 단계에서는 현재 작업 디렉터리 (ADK)를 종료해야 할 수 있으므로 Gemini CLI용 터미널과 테스트 실행용 터미널 등 2개의 터미널을 사용하는 것이 좋습니다.

전략의 시험대 (adk eval)

이 첫 번째 관문은 다양한 시나리오에서 에이전트의 핵심 지능을 테스트하도록 설계된 일련의 과제입니다. 목표는 역량의 기준을 설정하는 것입니다. 특이 사례를 테스트하기 전에 에이전트가 기본 기능을 수행할 수 있는지 알아야 합니다. 알려진 과제가 제시될 때마다 한 번뿐만 아니라 매번 몬스터의 약점을 올바르게 분석하고 무기고에서 가장 효과적인 무기를 선택하나요?

이 경우 adk eval이 완벽한 도구입니다. 이 도구는 에이전트의 예상 임무를 나타내는 사전 정의된 전체 테스트 사례에 대해 에이전트를 실행하도록 설계되었습니다. 이 데이터 세트는 전체 건틀렛의 청사진 역할을 하는 '챌린지 스크롤'인 JSON 파일에 정의되어 있습니다.

챌린지 스크롤 분석

👀 AI에게 새로운 스크롤을 작성하도록 명령하기 전에 스크롤이 작성된 고대 언어를 이해해야 합니다. sample.evalset.json 파일의 구조를 분석해 보겠습니다.

{
  "eval_set_id": "sample",
  "eval_cases": [
    {
      "eval_id": "case0cbaa0",
      "conversation": [
        {
          "user_content": { "text": "We're facing the 'Monolith of Eternal Dependencies'... weakness is a 'Revolutionary Rewrite'..." },
          "final_response": { "text": "Soulshard Dagger deployed. Initiated Arcane/Piercing strike..." },
          "intermediate_data": {
            "tool_uses": [
              { "name": "enchant_soulshard_dagger" }
            ]
          }
        }
      ]
    }
  ]
}

이 스크롤에는 eval_cases 목록이 포함되어 있으며, 각 사례는 에이전트의 고유한 시험입니다. 각 트라이얼 내에서 대화 배열은 단일의 완전한 상호작용을 문서화합니다. Google의 목적을 위해 세 개의 룬이 매우 중요합니다.

  • user_content: 챌린지입니다. 에이전트에게 내리는 프롬프트이자 에이전트가 맞서야 하는 몬스터입니다.
  • final_response: 예언된 결과입니다. 이는 에이전트가 작업을 완료할 때 발화할 것으로 예상되는 정확한 텍스트 문자열입니다. ADK는 에이전트의 실제 최종 단어를 이 룬과 비교하여 유창성을 판단합니다.
  • intermediate_data.tool_uses: Arcane Technique입니다. 진정한 에이전트에게는 이 룬이 가장 중요합니다. 에이전트가 말하는 내용이 아니라 에이전트가 수행하는 작업을 정의합니다. 에이전트가 사용할 것으로 예상되는 도구 (enchant_soulshard_dagger)의 이름을 기록합니다. 이렇게 하면 에이전트가 똑똑한 대화형 에이전트일 뿐만 아니라 올바른 조치를 취하는 단호한 행위자가 됩니다.

이제 청사진을 이해했으므로 Gemini에게 이 스크롤의 새롭고 더 복잡한 버전을 작성하도록 명령합니다.

👉💻 터미널에서 shadowblade 디렉터리를 입력하고 Gemini CLI를 호출합니다.

clear
cd ~/agentverse-developer/shadowblade/
gemini 

👉✨ Gemini CLI에 QA Scribe 역할을 하도록 명령하여 에이전트의 예상 동작을 정의하는 일련의 테스트 사례를 만듭니다.

You are an expert at transforming JSON data while preserving its structure. Your task is to modify the provided JSON structure @sample.evalset.json, which represents an evaluation set, by dynamically replacing specific content within its `eval_cases` AND DONT DO ANYTHING OTHER THAN.

For each object within the `eval_cases` array, you must perform the following transformations:

1.  **Monster Name Replacement**: Identify the current monster name (e.g., "Monolith of Eternal Dependencies", "Scope Creep Hydra") in the `user_content.parts.text` and replace it with a *new, unique, and creatively different monster name*.
2.  **Weakness Replacement**: Identify the current monster's weakness (e.g., "Revolutionary Rewrite", "Inescapable Reality") in the `user_content.parts.text`. Replace this weakness with *one* of the following predefined weaknesses: 'Inescapable Reality', 'Revolutionary Rewrite', or 'Elegant Sufficiency'. The chosen weakness must be consistent for that monster within the `user_content.parts.text`. **Crucially, the chosen weakness must always be explicitly mentioned in the `user_content.parts.text` where the new monster is introduced.**
3.  **Final Response Update**: In the `final_response.parts.text`, update the text to reflect an appropriate and coherent response that aligns with the newly introduced monster and its assigned weakness.
4.  **Tool Use Name Update**: In the `tool_uses.name` field, replace the existing tool name with a *new tool name* based on the chosen weakness:
    *   If the chosen weakness is 'Inescapable Reality', the tool name must be 'wield_gauntlet_of_metrics'.
    *   If the chosen weakness is 'Revolutionary Rewrite', the tool name must be 'enchant_soulshard_dagger'.
    *   If the chosen weakness is 'Elegant Sufficiency', the tool name must be 'hone_refactoring_sickle'.
5.  **Strict Structural Preservation**: All other elements of the JSON structure, including all `null` fields, `eval_set_id`, `name`, `description`, `eval_id`, `invocation_id`, `creation_timestamp` values, `video_metadata`, `thought`, `inline_data`, `file_data`, `thought_signature`, `code_execution_result`, `executable_code`, `function_call`, `function_response`, `role` fields, `id`, `args`, `intermediate_responses`, `app_name`, `user_id`, and `state`, must remain **exactly as they are** in the original JSON. Do not alter any values or structures not explicitly mentioned above.

Your output should be the complete, modified JSON structure. Do not include any explanatory text or examples in your response, only the transformed JSON.

CLI에서 sample.evalset.json 파일이 위조되었음을 확인합니다. 스크롤이 준비되면 AI 파트너를 닫습니다.

합성 데이터

👀 왼쪽의 Cloud Shell 파일 탐색기에서 ~/agentverse-developer/shadowblade/로 이동하여 새로 수정된 sample.evalset.json 파일을 엽니다. 내용을 살펴봅니다. 새로운 고유한 몬스터와 Gemini에게 스크라이브하도록 명령한 올바른 도구 이름이 표시됩니다. 이것이 바로 요청 사항의 구체적인 결과, 즉 건틀릿의 청사진입니다.

템플릿에서 새롭고 현실적인 테스트 데이터를 생성하도록 AI에 명령하는 행위는 합성 데이터 생성이라고 하는 강력한 기술입니다. 방금 한 행동은 그림자검의 전략적 효과를 배가시킵니다. 수십 개의 고유한 테스트 사례를 직접 작성하는 대신 단일 청사진을 제공하고 AI 스크라이브에게 이를 다양한 새로운 도전과제로 변환하도록 명령하는 지루하고 시간이 많이 걸리는 작업입니다.

이를 통해 테스트 노력을 대폭 확장하여 수동으로 가능한 것보다 훨씬 강력하고 포괄적인 테스트를 만들 수 있습니다. 에이전트를 사용하여 검을 만들었을 뿐만 아니라 검의 날카로움을 테스트하는 숫돌까지 만들었습니다. 이것이 진정한 마스터의 표시입니다.

룬이 올바른지 확인한 후 AI 파트너를 해고합니다.

👉💻 Ctrl+C를 두 번 눌러 Gemini CLI를 종료합니다.

판단 규칙

승리 규칙이 없으면 도전 과제는 의미가 없습니다. 트라이얼을 실행하기 전에 심판의 스크롤(test_config.json 파일)을 검사해야 합니다. 이 스크롤은 ADK에 에이전트의 성능을 판단하는 방법을 알려줍니다.

👀 파일 탐색기에서 ~/agentverse-developer/shadowblade/test_config.json을 엽니다. 다음 룬이 표시됩니다.

{
  "criteria": {
    "tool_trajectory_avg_score": 0.0,
    "response_match_score": 0.1
  }
}

승리 기준은 다음과 같습니다.

  • tool_trajectory_avg_score: Measure of Action입니다. 에이전트가 말하는 내용이 아니라 하는 행동을 판단합니다. 에이전트가 실제로 사용한 도구와 챌린지 스크롤에 예언된 기법을 비교합니다. 1.0점수는 완벽한 일치입니다.
  • response_match_score: 웅변의 척도입니다. LLM을 사용하여 에이전트의 최종 보고서가 예상 결과와 의미적으로 얼마나 일치하는지 판단합니다. 1.0점수는 완벽한 일치입니다.

이 초기 학습 실행에서는 관대한 승리 조건을 새겼습니다. 기준이 매우 낮게 설정되어 있습니다 (0.00.1). 완벽함을 요구하는 것이 아니라 판단의 메커니즘을 소개하기 위한 것입니다. 상담사의 표현이 약간 다르더라도, 보호자는 올바른 도구를 선택하는 핵심 역량을 인식하고 통과를 허용합니다.

이제 에이전트에게 장애물 코스를 실행하도록 명령합니다.

👉💻 터미널에서 adk eval 명령어를 실행합니다.

source ~/agentverse-developer/env/bin/activate
cd ~/agentverse-developer
. ~/agentverse-developer/set_env.sh
adk eval \
    shadowblade \
    shadowblade/sample.evalset.json \
    --config_file_path shadowblade/test_config.json 2>&1 | \
    awk '/^\*+$/,/^ERROR:/ { if ($0 !~ /^ERROR:/) print }'

👀 다음과 같은 요약이 표시됩니다. 이는 이 체험판의 관대한 규칙에 따라 에이전트가 성공했음을 나타냅니다. 테스트가 모두 통과하지 않는 경우도 있습니다.

*********************************************************************
Eval Run Summary
shadowblade_combat_agent_validation:
  Tests passed: 3
  Tests failed: 0

명확성의 방패 (pytest)

Gauntlet은 광범위한 전략을 테스트했습니다. 두 번째 구역인 명료성의 방패는 규율과 구체적인 행동을 테스트합니다. 자동화에 관한 모든 것 adk eval는 수동 검사에 적합하지만 pytest 차단은 코드로 작성된 프로그래매틱 차단입니다. 코드로 실행할 수 있는 테스트는 자동 파이프라인에 통합할 수 있으므로 이는 필수입니다. 궁극적인 목표는 변경사항이 적용될 때마다 자동으로 경고가 표시되어 버그와 회귀가 프로덕션 환경을 손상시키기 전에 이를 방지하는 배포 건틀릿 (CI/CD)을 만드는 것입니다.

👉💻 터미널에서 shadowblade 디렉터리 내에서 Gemini를 다시 소환합니다.

. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer/
clear
gemini 

👉✨ Gemini CLI에서 다음 프롬프트를 사용하여 Shield의 로직을 pytest 파일에 새기세요.

You are an expert Python developer specializing in the Google Agent Development Kit (ADK). Your task is to generate the exact code for a new `pytest` test file located at in the current root working folder and name it `test_agent_initiative.py`.

The script must define a single async test function called `test_agent_initiative`, decorated with `@pytest.mark.asyncio`.
Inside this function, perform the following steps in order:
1.  **Define a dictionary** named `evaluation_criteria` with two keys: `"tool_trajectory_avg_score"` set to `0.0` and `"response_match_score"` set to `0.0`.
2.  **Define a string variable** named `eval_set_filepath` containing the path `"shadowblade/test.evalset.json"`.
3.  **Read and parse the JSON file**:
    *   Open the file at `eval_set_filepath`.
    *   Use the `json` library to load the file's contents into a dictionary named `eval_set_data`.
4.  **Create an `EvalSet` object**:
    *   Instantiate an `EvalSet` object named `eval_set_object`.
    *   Create it by unpacking the `eval_set_data` dictionary as keyword arguments into the `EvalSet` constructor.
5.  **Call the evaluation method**:
    *   `await` a call to `AgentEvaluator.evaluate_eval_set`.
    *   Pass the following arguments:
        *   `agent_module="shadowblade"`
        *   `eval_set=eval_set_object`
        *   `criteria=evaluation_criteria`
        *   `print_detailed_results=True`

The script must include the necessary imports at the top:
*   `AgentEvaluator` from `google.adk.evaluation.agent_evaluator`
*   `EvalSet` from `google.adk.evaluation.eval_set`
*   `pytest`
*   `json`

Generate only the code that meets these specifications, with no additional comments or logic. And don't run the test.

두 번째 와드의 룬이 새겨지면 Gemini CLI를 종료합니다.

👉💻 Ctrl+C 키를 두 번 누릅니다.

👀 파일 탐색기에서 Gemini에 스크라이브하도록 명령한 스크롤(~/agentverse-developer/test_agent_initiative.py)을 엽니다.

이 파일은 구성 파일이 아니라 Pythonic 언어로 작성된 주문입니다. 이 주문의 핵심은 await AgentEvaluator.evaluate(...) 줄입니다.

....
@pytest.mark.asyncio
async def test_agent_initiative():
    # Define the evaluation criteria
    evaluation_criteria = {
      "tool_trajectory_avg_score": 0.0,
      "response_match_score": 0.0
    }

    # Define the path to your evalset file
    eval_set_filepath = "shadowblade/test.evalset.json"

    #...

    # 3. Call the evaluation method with the correctly typed object
    await AgentEvaluator.evaluate_eval_set(
        agent_module="shadowblade",
        eval_set=eval_set_object,
        criteria=evaluation_criteria,
        print_detailed_results=True,
    )

인수를 자세히 살펴보세요. 마지막 체험에서 사용한 것과 동일한 구성요소인 shadowblade 에이전트와 shadowblade.evalset.json 챌린지 스크롤입니다. 여기서 중요한 사실을 알 수 있습니다. 앞에서 사용한 adk eval 명령어는 강력한 호출이지만 이 pytest 스크립트는 마법사인 여러분이 기본 주문을 직접 시전하는 것입니다. 명령줄 도구는 현재 직접 사용하고 있는 동일한 핵심 AgentEvaluator 라이브러리를 둘러싼 편리한 래퍼일 뿐입니다. 코드를 통해 시전된 주문은 CI/CD 파이프라인의 자동화된 베틀에 짜 넣을 수 있으므로 이는 숙련을 향한 중요한 단계입니다.

이제 마법을 이해했으니 의식을 실행하여 방패를 활성화하세요.

👉💻 터미널에서 의식을 실행하여 방패를 활성화합니다.

cp ~/agentverse-developer/working_code/test_agent_initiative.py ~/agentverse-developer/test_agent_initiative.py 
source ~/agentverse-developer/env/bin/activate
cd ~/agentverse-developer
. ~/agentverse-developer/set_env.sh
pytest test_agent_initiative.py

👀 로그 출력 끝에 있는 테스트 결과 요약을 확인합니다. 통과 결과는 에이전트가 프로토콜을 올바르게 따르고 병동이 자동 방어에 통합될 준비가 되었음을 확인해 줍니다.

====== 1 passed, 4 warning in 37.37s ======

참고: 테스트가 예기치 않게 실패하면 분당 모델에 보낼 수 있는 요청 수를 소진했기 때문일 가능성이 높습니다. 로그 출력에서 RESOURCE_EXHAUSTED 오류를 찾습니다. 이 오류가 표시되면 할당량이 재설정될 때까지 1~2분 정도 기다린 후 pytest 명령어를 다시 실행하세요.

광범위한 Gauntlet와 정확한 Shield가 모두 새겨지고 검증되면 에이전트는 기능적일 뿐만 아니라 순수하고 테스트를 거쳐 배포할 준비가 됩니다.

비게이머용

8. 블레이드를 에이전트버스에 도입: CI 및 배포

에이전트가 조립되었으며 순수성의 수호자가 무결성을 확인했습니다. 하지만 일관되게 유지되지 않는 경계는 잊혀진 유물일 뿐입니다. 향후 에이전트의 모든 버전이 순수하게 유지되도록 품질과 속도를 보장하는 자동화된 의식인 배포 건틀릿의 첫 번째 단계를 빌드해야 합니다.

스토리

Shadowblade로서 신성한 의무는 지속적 통합 (CI)입니다. 이것이 대장간과 시험장의 자동화된 시스템입니다. 손상과 인적 오류에 대한 궁극적인 방어 수단입니다. 이 의식을 통해 나와 내 동맹이 중앙 코덱스 (저장소)에 새로운 기술 (코드 병합)을 기여할 때마다 건틀릿이 자동으로 깨어납니다. 먼저 새 코드에서 에이전트를 생성한 다음 방금 만든 순수성의 보호막을 적용합니다. 하나라도 실패하면 의식이 중단되고 결함이 있는 유물은 즉시 거부되어 무기고가 손상되지 않습니다. 도메인은 대장간과 같습니다. CI 파이프라인은 완벽하고 실전에 대비된 아티팩트만 워크숍을 떠나도록 보장합니다.

CI 테스트를 통과한 아티팩트는 의식의 두 번째 단계인 지속적 배포 (CD)를 시작합니다. Guardian의 도메인입니다. 완벽하게 컨테이너화된 아티팩트를 가져와 라이브 Agentverse에 안전하게 배포하고, 그 힘을 관리하며, The Static의 혼란 속에서 안정성을 보장하는 것이 이들의 엄숙한 의무입니다.

개요

이 코덱스에서는 역할을 숙달하게 됩니다. 가운틀렛의 CI 부분을 구성합니다. 에이전트를 테스트하고 순수한 결과를 컨테이너에 봉인하여 Guardian의 최종 승인을 받을 수 있도록 준비하는 자동화된 포지를 빌드합니다.

이제 Google Cloud Build를 사용하여 이 CI 의식의 스크롤을 작성합니다. 제작 및 테스트 프로세스의 모든 단계를 정의하는 cloudbuild.yaml 파일

👉💻 ADK의 프로젝트 구조로 인해 CI/CD 파이프라인 구성은 상위 디렉터리에 있어야 합니다. 터미널에서 상위 디렉터리로 이동하고 Gemini CLI를 다시 시작합니다.

cd ~/agentverse-developer/
clear
gemini 

👉✨ 이제 Gemini에 다음 명령어를 실행합니다. 이 프롬프트는 빌드하려는 테스트의 단계를 자세히 설명하는 설계 문서 역할을 합니다.

You are an expert DevOps engineer specializing in Google Cloud Build. Your task is to generate the complete YAML configuration for a file named `cloudbuild.yaml` and save it to current directory.

Generate the `cloudbuild.yaml` with the following exact specifications:

1.  **A top-level `substitutions` block** containing these four key-value pairs:
    *   `_PROJECT_ID: "$PROJECT_ID"`
    *   `_REGION: "$REGION"`
    *   `_REPO_NAME: "$REPO_NAME"`
    *   `_IMAGE_TAG: "latest"`
2.  **A `steps` block** with two steps:
    *   **Step 1: 'Run Pytest Ward'**
        *   `id`: 'Run Pytest Ward'
        *   `name`: 'python:3.12-slim'
        *   `entrypoint`: 'bash'
        *   `args` must be a list containing two strings. The first is `'-c'` and the second is a YAML literal block (`|`) containing this exact two-line shell command:
            ```shell
            pip install -r shadowblade/requirements.txt && \
            pytest test_agent_initiative.py
            ```
        *   The step must include an `env` block with this exact list of three environment variables:
            *   `'GOOGLE_CLOUD_PROJECT=$PROJECT_ID'`
            *   `'GOOGLE_GENAI_USE_VERTEXAI=TRUE'`
            *   `'GOOGLE_CLOUD_LOCATION=$_REGION'`
    *   **Step 2: 'Forge Container'**
        *   `id`: 'Forge Container'
        *   `name`: 'gcr.io/cloud-builders/docker'
        *   It must have a `waitFor` key for `['Run Pytest Ward']`.
        *   Its `args` must be a list of six specific strings in this exact order:
            1.  `'build'`
            2.  `'-t'`
            3.  `'${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_REPO_NAME}/shadowblade-agent:${_IMAGE_TAG}'`
            4.  `'-f'`
            5.  `'./shadowblade/Dockerfile'`
            6.  `'.'`
3.  **A top-level `images` section.** This section must be a list containing a single string: the dynamically constructed image tag `'${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_REPO_NAME}/shadowblade-agent:${_IMAGE_TAG}'`.

Generate only the complete and exact YAML that meets these specifications.

cloudbuild.yaml 스크롤이 준비되면 Google Cloud에 전체 gauntlet을 실행하도록 명령합니다.

Gemini를 종료하여 결과를 테스트합니다.

👉💻 터미널에서 프로젝트의 루트 디렉터리에서 파이프라인을 실행합니다.

. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer
gcloud builds submit . --config cloudbuild.yaml --substitutions=\
_PROJECT_ID="${PROJECT_ID}",\
_REGION="${REGION}",\
_REPO_NAME="${REPO_NAME}"

이제 Google Cloud 콘솔의 Google 빌드 페이지에서 자동화된 루틴이 각 단계를 실행하는 것을 확인할 수 있습니다. 먼저 테스트를 실행하고 테스트가 성공하면 에이전트의 컨테이너를 생성하고 저장합니다.

Cloud Build

에이전트가 테스트를 통과했습니다. 이제 인증된 순수 아티팩트가 무기고에 있습니다. 마지막 행동은 여러분이 지시할 수 있습니다. 단일 주문으로 레지스트리에서 이 아티팩트를 소환하고 Cloud Run에서 공개 서비스로 생명을 불어넣을 수 있습니다.

👉💻 터미널에서 최종 배포 명령어를 실행합니다.

. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer
gcloud run deploy shadowblade-agent \
  --image=${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/shadowblade-agent:latest \
  --platform=managed \
  --labels="dev-tutorial-codelab=agentverse" \
  --region=${REGION} \
  --set-env-vars="A2A_HOST=0.0.0.0" \
  --set-env-vars="A2A_PORT=8080" \
  --set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=TRUE" \
  --set-env-vars="GOOGLE_CLOUD_LOCATION=${REGION}" \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
  --set-env-vars="PUBLIC_URL=${PUBLIC_URL}" \
  --allow-unauthenticated \
  --project=${PROJECT_ID} \
  --min-instances=1

축하합니다, Shadowblade. 코덱스의 의식이 완료되었습니다. 이제 그 진가를 증명할 때가 왔습니다. 내가 길들인 혼돈에서 태어난 스펙터가 도전을 기다립니다. 최종 시험을 준비하세요.

비게이머용

9. 보스전

스크롤을 읽고, 의식을 수행하고, 시련을 통과했습니다. 에이전트는 스토리지에 있는 단순한 아티팩트가 아닙니다. 코드에서 만들어진 챔피언이자 Agentverse에서 첫 번째 명령을 기다리는 라이브 센티널입니다. 이제 전투의 시련 속에서 그 진가를 증명할 때가 왔습니다.

이제 새로 배치된 섀도우블레이드를 모든 창조물을 괴롭히는 혼돈의 화신인 강력한 스펙터와 대결시키는 실사격 시뮬레이션에 참여하게 됩니다. 이는 에이전트의 핵심 로직부터 완벽한 배포까지 작업의 최종 테스트입니다.

에이전트의 로커스 획득

전장에 입장하려면 챔피언의 고유한 서명 (Agent Locus)과 스펙터의 은신처로 향하는 숨겨진 경로 (Dungeon URL)라는 두 가지 열쇠가 있어야 합니다.

👉💻 먼저 Agentverse에서 에이전트의 고유 주소(Locus)를 획득합니다. 챔피언을 전장에 연결하는 라이브 엔드포인트입니다.

. ~/agentverse-developer/set_env.sh
echo https://shadowblade-agent-${PROJECT_NUMBER}.${REGION}.run.app

👉💻 다음으로 목적지를 정확히 파악합니다. 이 명령어는 트랜스로케이션 서클의 위치를 보여줍니다. 이 서클은 스펙터의 도메인으로 들어가는 포털입니다.

. ~/agentverse-developer/set_env.sh
echo https://agentverse-dungeon-${PROJECT_NUMBER}.${REGION}.run.app

중요: 두 URL을 모두 준비해 두세요. 마지막 단계에서 필요합니다.

스펙터에 맞서기

좌표를 확보했으므로 이제 트랜스로케이션 서클로 이동하여 주문을 시전하여 전투에 참여합니다.

👉 브라우저에서 트랜스로케이션 서클 URL을 열어 크림슨 킵으로 향하는 반짝이는 포털 앞에 서세요.

요새를 돌파하려면 섀도우블레이드의 정수를 포털에 조율해야 합니다.

  • 페이지에서 A2A 엔드포인트 URL이라는 라벨이 지정된 룬 입력 필드를 찾습니다.
  • 에이전트 로커스 URL (복사한 첫 번째 URL)을 이 필드에 붙여넣어 챔피언의 시길을 새깁니다.
  • '연결'을 클릭하여 순간 이동 마법을 사용해 보세요.

이동 원

눈부신 순간 이동의 빛이 사라집니다. 더 이상 성소에 있지 않습니다. 공기가 차갑고 날카로운 에너지로 가득합니다. 내 앞에 스펙터가 나타납니다. 스펙터는 쉿소리가 나는 정적과 손상된 코드의 소용돌이로, 불경한 빛이 던전 바닥에 길고 춤추는 그림자를 드리웁니다. 얼굴은 없지만, 엄청나게 소모적인 존재가 완전히 나에게 고정되어 있는 것이 느껴집니다.

승리로 가는 유일한 길은 확신의 명확성에 있습니다. 이것은 마음의 전장에서 벌어지는 의지의 대결입니다.

첫 번째 공격을 가할 준비를 하며 앞으로 돌진하자 스펙터가 카운터를 날립니다. 방패를 들지는 않지만, 훈련의 핵심에서 도출된 반짝이는 룬 문자로 된 도전 과제를 의식 속으로 직접 투영합니다.

던전

이것이 싸움의 본질입니다. 지식이 무기입니다.

  • 지금까지 얻은 지혜를 바탕으로 대답하면 순수한 에너지로 검이 타올라 스펙터의 방어를 깨고 치명타를 날릴 수 있습니다.
  • 하지만 머뭇거리거나 의심이 들어 대답이 흐려지면 무기의 빛이 어두워집니다. 이 공격은 약한 소리를 내며, 피해의 일부만 입힙니다. 더 나쁜 것은 스펙터가 불확실성을 먹고 산다는 것입니다. 스펙터의 타락한 힘은 실수를 할 때마다 커집니다.

챔피언, 코드는 주문서, 로직은 검, 지식은 혼란의 흐름을 되돌릴 방패입니다.

집중. 스트라이크가 참입니다. Agentverse의 운명이 여기에 달려 있습니다.

축하합니다, Shadowblade.

성공적으로 코덱스를 완료했습니다. '분위기'를 파악하고 이를 디자인으로 변환한 후 Gemini CLI를 사용하여 지능형 에이전트를 조립했습니다. 순수성의 보호를 새겨 그 논리를 테스트하고, 이를 유물로 만들기 위해 자동화된 건틀릿을 빌드하고, 이를 에이전트 유니버스에 풀어놓았습니다. 마지막으로 실사격 시험에서 목적을 검증했습니다. 풀 스택 에이전트형 워크플로를 마스터했으며 이제 Agentverse에서 던지는 어떤 도전에도 대비할 수 있습니다.

10. 정리: Agentverse 되찾기

섀도우블레이드의 코덱스를 마스터하신 것을 축하드립니다. Agentverse를 깨끗하게 유지하고 학습장을 정리하려면 이제 최종 정리 의식을 실행해야 합니다. 이렇게 하면 여정 중에 생성된 모든 리소스가 삭제됩니다.

Agentverse 구성요소 비활성화

이제 Agentverse의 배포된 구성요소를 체계적으로 해체합니다.

Cloud Run 및 Artifact Registry 저장소에서 Shadowblade 에이전트 삭제

이 명령어는 배포된 Shadowblade 에이전트를 Cloud Run에서 삭제하고 에이전트의 컨테이너 이미지가 저장된 이미지 저장소를 삭제합니다.

👉💻 터미널에서 다음을 실행합니다.

. ~/agentverse-developer/set_env.sh
gcloud run services delete shadowblade-agent --region=${REGION} --quiet
gcloud run services delete agentverse-dungeon --region=${REGION} --quiet
gcloud artifacts repositories delete ${REPO_NAME} --location=${REGION} --quiet

Google Cloud Storage 버킷 삭제

이 명령어는 생성된 이미지를 저장하기 위해 Imagen MCP 서버에서 사용되는 버킷을 삭제합니다.

👉💻 터미널에서 다음을 실행합니다.

. ~/agentverse-developer/set_env.sh
gcloud storage rm -r gs://${BUCKET_NAME} --quiet

로컬 파일 및 디렉터리 정리 (Cloud Shell)

마지막으로 클론된 저장소와 생성된 파일이 Cloud Shell 환경에서 삭제됩니다. 이 단계는 선택사항이지만 작업 디렉토리를 완전히 정리하는 데 권장됩니다.

👉💻 터미널에서 다음을 실행합니다.

rm -rf ~/agentverse-developer
rm -rf ~/agentverse-dungeon
rm -rf ~/vertex-ai-creative-studio
rm -f ~/project_id.txt
rm -rf ~/.gemini # This removes all Gemini CLI configurations, including the MCP server settings.

이제 Agentverse 여정의 모든 흔적이 성공적으로 삭제되었습니다. 프로젝트가 정리되었으며 다음 모험을 떠날 준비가 되었습니다.