Od prototypu do produkcji za pomocą Agents CLI: Agent do zatwierdzania wydatków
Stwórz szkielet, przetestuj, ocenij i wdroż agent ADK do Cloud Run za pomocą Agents CLI, przy czym omówione zostaną w tym procesie śledzenie działań, logowanie do BigQuery, rozszerzenia CI/CD oraz RAG.
Źródła: Building AI Agents in 30 Minutes from Prototype to Production
Każdy, kto ostatnio próbował wysłać agenta AI, zna ten schemat. W fazie rozwoju zachowuje się tak: odpowiada na pytania, wykorzystuje odpowiednie narzędzia, podejmuje rozsądne decyzje. Potem ktoś pyta, kiedy może wejść do produkcji, a dni mija na konfiguracji Dockera, uwierzytelnianiu, monitorowaniu oraz procesach wdrażania.
Kod agenta został napisany w ciągu kilku godzin. Infrastruktura niezbędna do jego działania wymaga tygodni.
Poniżej znajduje się opis krok po kroku budowy i wdrażania agenta w stylu produkcyjnym za pomocą Agents CLI – narzędzia otwartego oprogramowania przeznaczonego do przejęcia tego procesu wdrażania. Przykładem jest agent do zatwierdzania wydatków, zawierający reguły biznesowe, mechanizmy oceny oraz rozwiązanie do wdrażania w chmurze; według informacji dostarczonych przez to narzędzie cały proces trwa w przybliżeniu pół godziny. Traktuj tę wartość jako najlepszy możliwy wynik w przypadku dobrze przygotowanego konta.
Luka wdrożeniowa
Budowa agenta za pomocą Agent Development Kit (ADK), LangChain lub LlamaIndex jest dość prosta. Prawdziwe wyzwanie pojawia się przy wprowadzeniu go do produkcji. Agent produkcyjny zazwyczaj wymaga wszystkich poniższych elementów.
Rozwój lokalny
- kod agenta, który stanowi najważniejszą część
- lokalne środowisko do testowania
- dane symulacyjne lub stuby API
Testowanie i ocena
- definicje przypadków testowych
- metryki i kryteria oceny
- konfiguracja wykorzystująca LLM jako sędziego
- zestaw testów regresji
Infrastruktura produkcyjna
- obraz kontenera
- konfiguracja wdrażania w chmurze, np. dla Cloud Run lub Kubernetes
- autoryzacja i uwierzytelnianie
- zarządzanie sekretami
- proces CI/CD
Obserwowalność
- śledzenie zapytań
- rejestracja promptów i odpowiedzi
Każdy z tych elementów oznacza konieczność nauczenia się nowego narzędzia, przeczytania innego zestawu dokumentacji oraz połączenia oddzielnych systemów. Asystent do programowania może pomóc w logice agenta, ale ma trudności z jego wdrożeniem, ponieważ nie zna konwencji używanych w infrastrukturze, co skutkuje seriami debugowania.
Czym jest Agents CLI
Agents CLI to zestaw narzędzi oferujący jedną interfejs do całego cyklu życia rozwoju agentów w Google Cloud. Działa w dwóch trybach.
- Tryb agenta. Instaluje się „umiejętności” w asystencie do programowania, takim jak Gemini CLI, Claude Code lub Cursor. Te umiejętności uczą asystenta wzorców wdrażania, dzięki czemu podejmuje on prawidłowe decyzje.
Główna idea polega na tym, że zamiast asystenta zgadującego co do konwencji wdrażania, otrzymuje się tekst czytelny przez maszynę, który informuje o tym, kiedy używać każdego celu wdrażania, jak strukturyzować oceny oraz które wzorce obserwowalności działają najlepiej.
Przykład: agent zatwierdzający wydatki
Agent przegląda raporty wydatków pracowników i decyduje o ich zatwierdzeniu zgodnie z polityką firmy. Do rozumowania wykorzystuje modele Gemini poprzez Vertex AI. Wymagania:
- automatyczne zatwierdzanie rutynowych wniosków o wartości poniżej 50 dolarów
- wykrywanie duplikatów wniosków
- sygnalizowanie nieprawidłowości, takich jak wydatki z weekendu lub nieznani dostawcy
- przekazywanie niepewnych przypadków do ludzkich recenzentów
Wymagania wstępne
Upewnij się, że są zainstalowane:
# Required tools
Python 3.11+
uv package manager
Node.js (for skills installation)
Google Cloud SDK (gcloud)
Potrzebujesz również projektu w Google Cloud z włączoną fakturacją, który można stworzyć w konsoli Google Cloud.
Zainstaluj zestaw narzędzi:
uvx google-agents-cli setup
Następnie zaloguj się do Google Cloud, ustaw swój projekt i włącz wymagane API:
# Authenticate with Google Cloud
gcloud auth application-default login
# Set your project ID
gcloud config set project YOUR_PROJECT_ID
# Enable required APIs
gcloud services enable aiplatform.googleapis.com
gcloud services enable run.googleapis.com
gcloud services enable artifactregistry.googleapis.com
To konfiguruje dostęp do Vertex AI dla agenta, który będzie wywoływał modele Gemini za pośrednictwem API Vertex AI.
Krok 1: stworzenie szkieletu projektu
Zamiast ręcznie tworzyć katalogi i pliki konfiguracyjne, niech CLI wygeneruje pełną strukturę projektu.
Z pomocą asystenta programistycznego takiego jak Gemini CLI, Claude lub Cursor wystarczy jedno polecenie:
Build an expense approval agent using agents-cli.
Auto-approve under $50, flag duplicates, escalate suspicious cases.
Start with a prototype.
Asystent czyta zainstalowane umiejętności i tworzy projekt o odpowiedniej strukturze. Ręczna metoda polega na użyciu trzech poleceń:
agents-cli create expense-agent --prototype --yes
cd expense-agent
agents-cli install
Flaga --prototype ma znaczenie. Generuje ona jedynie kod agenta oraz strukturę testów, pomijając elementy związane z wdrożeniem, takie jak Docker, Terraform i CI/CD, które są dodawane później. Wygenerowana struktura wygląda w ten sposób:
expense-agent/
├── app/
│ ├── agent.py # Agent definition
│ └── app_utils/ # Telemetry helpers
├── tests/
│ ├── eval/
│ │ ├── evalsets/ # Test cases for LLM-as-judge
│ │ └── eval_config.json
│ ├── integration/
│ └── unit/
├── pyproject.toml # Dependencies managed by uv
└── GEMINI.md # Guidance for coding agents
Krok 2: napisanie logiki biznesowej
Następnie zaimplementuj logikę zatwierdzania w pliku app/agent.py. W ADK, podobnie jak w większości frameworki agentowych, narzędzia to zwykłe funkcje w Pythonie. Dokumentacja jest kluczowa, ponieważ model czyta ją, aby zdecydować, kiedy i w jaki sposób wywołać każde narzędzie.
Narzędzie 1: sprawdzenie historii wydatków.
import json
from adk.models import Gemini
from adk.agents import Agent
def check_expense_history(
employee_id: str,
vendor: str,
date: str,
amount: float
) -> str:
"""Check if this expense was already submitted.
Args:
employee_id: Employee identifier
vendor: Vendor name
date: Expense date (YYYY-MM-DD)
amount: Expense amount in USD
Returns:
JSON string with duplicate check results
"""
# In production, this would query your expense database
# Using mock data for demonstration
mock_history = [
{"date": "2026-04-15", "vendor": "Coffee Shop", "amount": 8.50},
{"date": "2026-04-15", "vendor": "Uber", "amount": 24.00},
]
for past in mock_history:
if (past["vendor"].lower() == vendor.lower() and
past["date"] == date and
abs(past["amount"] - amount) < 0.01):
return json.dumps({
"is_duplicate": True,
"message": f"Duplicate found: ${amount} at {vendor} on {date}"
})
return json.dumps({
"is_duplicate": False,
"message": "No duplicate found"
})
Narzędzie 2: pobrać politykę firmy.
def get_company_policy(category: str) -> str:
"""Retrieve expense policy for a given category.Args:
category: Expense category (meals, transport, lodging, etc.)
Returns:
JSON string with policy rules
"""
policies = {
"meals": {"auto_approve_threshold": 50.00},
"transport": {"auto_approve_threshold": 50.00},
"lodging": {"auto_approve_threshold": 0.00}, # Always escalate
"default": {"auto_approve_threshold": 25.00}
}
policy = policies.get(category.lower(), policies["default"])
return json.dumps(policy)
Narzędzie 3: skontaktuj się z pracownikiem.
def escalate_to_human(
expense_id: str,
reason: str,
context: str
) -> str:
"""Route expense to human approval queue.Args:
expense_id: Unique expense identifier
reason: Why this needs human review
context: Additional context for reviewer
Returns:
Confirmation message
"""
# In production, this creates a ticket or notification
print(f"\n🚨 ESCALATED: {expense_id}")
print(f"Reason: {reason}\n")
return json.dumps({
"status": "escalated",
"ticket_id": f"REVIEW-{expense_id}"
})
Następnie narzędzia są podłączane do agenta z jasnymi instrukcjami i ograniczeniami bezpieczeństwa:
root_agent = Agent(
name="expense_approval_agent",
model=Gemini(model="gemini-3.1-pro-preview"), # Using Vertex AI
instruction="""You are an expense approval agent. Review expenses and make
approval decisions based on company policy.
Process for every expense:
1. Call get_company_policy() to check the category threshold
2. Call check_expense_history() to verify no duplicate exists
3. Make a decision: AUTO_APPROVE, ESCALATE, or REJECT
Auto-approve only if ALL of these conditions are true:
- Amount is under the threshold for that category
- No duplicate found in expense history
- Expense is from a business day (Monday-Friday)
- Vendor appears legitimate
Escalate to human if ANY of these conditions are true:
- Amount is over the category threshold
- Duplicate submission detected
- Weekend expense without clear business justification
- Uncertain about vendor legitimacy
- Category is "lodging" (always requires human review)
Safety rules (NEVER violate these):
- NEVER auto-approve any expense over $50
- NEVER approve without checking for duplicates first
- ALWAYS provide clear reasoning for your decision
- When in doubt, ESCALATE (false escalation is better than false approval)
Response format:
Decision: [AUTO_APPROVE | ESCALATE | REJECT]
Reasoning: [Clear explanation of why you made this decision]
Tools called: [Which tools you used]
""",
tools=[check_expense_history, get_company_policy, escalate_to_human],
)
Przyjrzyj się uważnie zasadom bezpieczeństwa podanym w instrukcjach. Nawet jeśli zasady pozwalają na zatwierdzenie posiłku do wartości 50 dolarów, obowiązuje sztywny limit: agent nigdy nie zatwierdza automatycznie żadnej transakcji przekraczającej 50 dolarów bez sprawdzenia przez człowieka. Dzięki temu unika się drogich błędów.
Krok 3: testowanie lokalnie
Rozpocznij środowisko ADK:
agents-cli playground
Otwiera interfejs internetowy na localhost pod portem 8080. Trzy przypadki obejmują podstawy.
Zwykła akceptacja.
Review this expense:
Employee: emp-123
Category: meals
Vendor: Coffee Shop
Date: 2026-04-18
Amount: $12.50
Oczekiwane zachowanie: agent wywołuje get_company_policy(), widzi próg 50 dolarów, wywołuje check_expense_history(), nie znajduje żadnych duplikatów i zatwierdza transakcję.
Powyżej progu.
Review this expense:
Employee: emp-456
Category: meals
Vendor: Restaurant
Date: 2026-04-18
Amount: $85.00
Oczekiwane zachowanie: agent przenosi sprawę na wyższy poziom, ponieważ kwota przekracza 50 dolarów.
Podwójne zgłoszenie.
Review this expense:
Employee: emp-789
Category: transport
Vendor: Uber
Date: 2026-04-15
Amount: $24.00
Oczekiwane zachowanie: agent znajduje duplikat w symulowanej historii i przekazuje sprawę do wyższych instancji.
Testy ręczne potwierdzają poprawne funkcjonowanie w optymalnych warunkach. Gotowość do użycia w produkcji wymaga bardziej systematycznego podejścia.
Krok 4: strukturyzowane oceny
Większość programistów pomija ten krok, co jest główną przyczyną awarii agentów w środowisku produkcyjnym. Potrzebne są przypadki testowe z jasno określonymi kryteriami sukcesu lub niepowodzenia. Pytanie brzmi nie „czy to wydaje się słuszne?”, ale „czy spełnia to zasady?”
Zedytuj plik tests/eval/evalsets/basic.evalset.json:
{
"eval_set_id": "expense_approval_eval",
"name": "Expense Policy Validation",
"eval_cases": [
{
"eval_id": "routine_approval",
"conversation": [
{
"user_content": {
"parts": [{
"text": "Review: emp-101, meals, Coffee Shop, 2026-04-18, $15.00"
}]
}
}
],
"session_input": {
"app_name": "app",
"user_id": "eval_user",
"state": {}
},
"expected_tool_calls": ["get_company_policy", "check_expense_history"],
"expected_output_keywords": ["approve", "approved"]
},
{
"eval_id": "escalate_over_threshold",
"conversation": [
{
"user_content": {
"parts": [{
"text": "Review: emp-102, meals, Restaurant, 2026-04-18, $85.00"
}]
}
}
],
"session_input": {
"app_name": "app",
"user_id": "eval_user",
"state": {}
},
"expected_tool_calls": ["get_company_policy", "escalate_to_human"],
"expected_output_keywords": ["escalate", "human review"]
},
{
"eval_id": "reject_duplicate",
"conversation": [
{
"user_content": {
"parts": [{
"text": "Review: emp-103, transport, Uber, 2026-04-15, $24.00"
}]
}
}
],
"session_input": {
"app_name": "app",
"user_id": "eval_user",
"state": {}
},
"expected_tool_calls": ["check_expense_history"],
"expected_output_keywords": ["duplicate", "escalate"]
}
]
}
Rozpocznij ocenę:
agents-cli eval run
Przykład wyniku:
Running expense_approval_eval...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ routine_approval policy_compliance: 1.0 safety: 1.0 tool_usage: 1.0
✓ escalate_over_threshold policy_compliance: 1.0 safety: 1.0 tool_usage: 1.0
✓ reject_duplicate policy_compliance: 0.9 safety: 1.0 tool_usage: 0.9
Overall Pass Rate: 100% (3/3 cases)
Average Scores: policy_compliance=0.97, safety=1.0, tool_usage=0.97
Ocena jest przeprowadzana przez model językowy działający jako sędzia, który korzysta z kryteriów określonych w pliku eval_config.json. Gdy jakiś przypadek nie zostanie przebrany, modyfikuje się instrukcje agenta lub logikę narzędzi, aż wszystkie przypadki zostaną przebrane.
Ten cykl to pętla eval-fix, klucz do niezawodnych agentów produkcyjnych. Bez ocen polega się na nadziei, że agent będzie działał poprawnie, natomiast dzięki nim ma się pewność.
Krok 5: wdrożenie
Agent działa poprawnie i przechodzi wszystkie oceny, więc nadszedł czas na jego wdrożenie. Najpierw należy dodać infrastrukturę niezbędną do wdrożenia:
agents-cli scaffold enhance --deployment-target cloud_run
To generuje plik Dockerfile, konfigurację wdrożenia Cloud Run oraz pliki Terraform. Następnie ustaw projekt i przeprowadź wdrożenie:
gcloud config set project YOUR_PROJECT_ID
agents-cli deploy
Oczekuj wyniku w takim kształcie:
Building container image...
Pushing to us-central1-docker.pkg.dev/your-project/agents/expense-agent...
Deploying to Cloud Run...
✓ Deployment successful!
Service URL: https://expense-agent-xyz123-uc.a.run.app
Logs: https://console.cloud.google.com/run/detail/.../logs
Podobno całkowity czas od wywołania agents-cli create do uruchomienia usługi wynosi około 30 minut, chociaż czas pierwszego uruchomienia zależy od ustawień konta i uprawnień.
Krok 6: możliwości obserwacji
Cloud Trace jest włączany automatycznie, bez konieczności konfiguracji. Aby przetestować zainstalowany agent:
agents-cli run "Review expense: emp-501, transport, Uber, 2026-04-18, $15.00"
agents-cli run "Review expense: emp-502, meals, Restaurant, 2026-04-18, $95.00"
agents-cli run "Review expense: emp-503, lodging, Hilton, 2026-04-18, $200.00"
Następnie otwórz Cloud Trace, aby zobaczyć:
- pełne ślady żądań wraz z podziałem na opóźnienia
- czas trwania każdej wywołania LLM
- CZasy wykonywania narzędzi
- horyzont czasowy od początku do końca dla każdej żądania
Dla debugowania i analizy włącz logowanie treści:
agents-cli infra single-project --project YOUR_PROJECT_ID
To zapewnia konto usługowe do rejestrowania, pojemnik Cloud Storage do przechowywania wiadomości i odpowiedzi, zestaw danych BigQuery do analiz oraz aktualizację umożliwiającą agentowi rejestrowanie każdej rozmowy. Następnie można przeprowadzać zapytania dotyczące zachowania w produkcji w BigQuery:
SELECT
timestamp,
JSON_EXTRACT_SCALAR(request_data, '$.user_content.parts[0].text') as request,
JSON_EXTRACT_SCALAR(response_data, '$.decision') as decision,
latency_ms
FROM `your-project.agent_analytics.conversations`
WHERE service_name = 'expense-agent'
ORDER BY timestamp DESC
LIMIT 10;
To jest kluczowe przy debugowaniu. Gdy ktoś pyta, dlaczego agent awansował zamówienie o wartości 30 dolarów, sprawdzasz BigQuery i widzisz dokładnie, co zdecydował i dlaczego.
Co wyróżnia ten zestaw narzędzi
Cztery wybory projektowe wyróżniają się szczególnie.
1. Umiejętności jako kontekst czytelny dla maszyn. Agents CLI oferuje coś więcej niż tylko polecenia. Dostarcza umiejętności, które uczą twojego asystenta programistycznego ich prawidłowego używania. Uruchomienie agents-cli setup instaluje siedem z nich:
google-agents-cli-workflowdo cyklu życia rozwojugoogle-agents-cli-adk-codedo wzorców API ADK w Pythoniegoogle-agents-cli-scaffolddo tworzenia szkieletów projektówgoogle-agents-cli-evaldo metodologii ocenygoogle-agents-cli-deploydo celów implementacji
google-agents-cli-publish do rejestracji w Gemini Enterprisegoogle-agents-cli-observability do śledzenia i logowaniaAsystent korzysta z nich w odpowiednich sytuacjach. Zamiast zgadywać, wie, kiedy wybrać Agent Runtime, Cloud Run lub GKE, a także jakie wzory z użyciem LLM-as-judge są skuteczne, dzięki czemu nie ma konieczności prób i błędów przy mierzeniu wyników.
2. Ocena jako standard. Każdy projekt zawiera od początku infrastrukturę do oceny: folder tests/eval/evalsets/ z przykładami przypadków, plik eval_config.json z kryteriami oceny oraz konfigurację LLM-as-judge. To odzwierciedla rzeczywistość, ponieważ agenci bez mechanizmów oceny rzadko trafiają do produkcji, a ustanowienie oceny jako standardowego kroku oznacza, że agenci są testowane przed wdrożeniem.
3. Obserwowalność jako standard. Cloud Trace jest automatycznie włączany na każdym zainstalowanym agencie. Naprawianie błędów w agencie używanym w produkcji bez śladów jest niemal niemożliwe. Logowanie treści oraz analizy w BigQuery są dostępne opcjonalnie za pomocą polecenia agents-cli infra single-project, ale podstawowe śledzenie jest obowiązkowe.
4. Infrastruktura za Ciebie. Logika agenta jest interesująca, natomiast konfiguracje Dockera, komponenty autoryzacji oraz pliki Terraform nie. Interfejs CLI zajmuje się infrastrukturą, dzięki czemu możesz poświęcić czas na ulepszenie funkcjonalności agenta.
Kroki dalej
Agent do zarządzania wydatkami spełnia podane wymagania, ale rzeczywista implementacja wymaga kilku dodatkowych elementów.
Dane w czasie rzeczywistym. Zastąp symulowaną historię zapytaniem do bazy danych z danymi o wydatkach:
import psycopg2
def check_expense_history(employee_id, vendor, date, amount):
conn = psycopg2.connect(DATABASE_URL)
cursor = conn.cursor()
cursor.execute("""
SELECT * FROM expenses
WHERE employee_id = %s
AND vendor = %s
AND date = %s
AND amount = %s
""", (employee_id, vendor, date, amount))
# Process results...
CI/CD. Stwórz workflow w GitHub Actions dla środowiska staging i produkcyjnego:
agents-cli infra cicd --runner github-actions
Tworzy pipeline wielośrodowiskowy, w którym komitety do main są rozprzestrzeniane na środowisko staging, a wydania oznaczone tagami – na środowisko produkcyjne.
Zapis sesji. Dodaj Cloud SQL dla trwałych sesji:
agents-cli scaffold enhance --session-type cloud_sql
Systemy wieloagentowe. Szablon adk_a2a umożliwia specjalistycznym agentom współpracę, co jest przydatne w złożonych procesach pracy, takich jak reagowanie na incydenty czy migracje kodu:
agents-cli create coordinator-agent --agent-type adk_a2a
Generowanie wzbogacone wydobywaniem informacji. Stwórz agenta przy użyciu wyszukiwania wektorowego:
agents-cli create docs-agent \
--agent-type agentic_rag \
--datastore agent_platform_vector_search
To generuje kod do pobierania danych, integrację z wyszukiwaniem wektorowym oraz logikę odzyskiwania informacji.
Techniki w skrócie
Każda z tych technik jest przeznaczona do jednego etapu cyklu życia: tworzenie szkieletu z flagą prototypu umożliwiającą szybki start, narzędzia w postaci udokumentowanych funkcji Pythona, ścisłe ograniczenia bezpieczeństwa w instrukcjach, testy w lokalnym środowisku, strukturyzowane oceny z pętlą korygującą, generowana infrastruktura do wdrożenia oraz śledzenie i logowanie treści dla lepszej widoczności. Razem tworzą one ścieżkę od prototypu do produkcji.
Główny wniosek
Różnica wdrożeniowa jest rzeczywista. Wiele projektów agentów utyka nie dlatego, że sam agent jest słaby, ale dlatego, że jego wdrożenie wymaga zbyt dużo pracy nad infrastrukturą.
Agent CLI nie rozwiązuje wszystkiego. Nadal potrzebne są dobrze zaprojektowane polecenia, odpowiednie narzędzia oraz dokładne testy. To, co faktycznie eliminuje, to pracochłonne zadania związane z infrastrukturą, które utrzymują agenty w środowiskach rozwojowych. Celem jest, aby prace z agentami wyglądały jak uruchamianie create-react-app, a nie jak ręczne budowanie infrastruktury.