ورود Agent Gateway به Agent Runtime با Model Armor

۱. مقدمه

این Codelab به بررسی مدیریت ورود Agent Gateway برای عامل‌های هوش مصنوعی میزبانی‌شده در Agent Runtime می‌پردازد.

دروازه عامل (Agent Gateway) که در حالت ورودی ( کلاینت به عامل ) عمل می‌کند، از ارتباطات حاکم بین کلاینت‌ها - کاربران نهایی انسانی، عامل‌های دسکتاپ، IDEهای کدنویسی، عامل‌های همتا و غیره - و عامل‌های میزبان Agent Runtime پشتیبانی می‌کند. این حالت برای محافظت از عامل‌ها در برابر حملات تزریق سریع ورودی یا محتوای مضر ارسال شده توسط کلاینت‌ها استفاده می‌شود. تمام ترافیک ورودی با استفاده از افزونه‌های مجوز و Model Armor پردازش می‌شود تا نقطه ورود به شبکه را برای تمام تعاملات عامل ایمن کند.

آنچه می‌سازید

  • دروازه عامل در حالت ورودی ( کلاینت به عامل )
  • افزونه‌ی مجوز زره مدل
  • عامل ADK Runtime با هویت عامل
  • داده‌های فایل ذخیره‌سازی ابری که توسط عامل با استفاده از MCP پرس‌وجو می‌شود
  • الگوهای زرهی مدل برای غربالگری سوالات و پاسخ‌های LLM
  • الگوهای حفاظت از داده‌های حساس برای شناسایی مجدد داده‌ها

شکل1

شکل 1. معماری Codelab

آنچه یاد می‌گیرید

  • نحوه‌ی استقرار Agent Gateway برای غربالگری ترافیک ورودی به یک Agent
  • نحوه پیکربندی افزونه‌های مجوز و واگذاری اختیارات Model Armor
  • نحوه ایجاد و استقرار قالب‌های سفارشی Model Armor
  • نحوه ایجاد و استقرار قالب‌های سفارشی حفاظت از داده‌های حساس
  • نحوه آزمایش و اعتبارسنجی سیاست‌های غربالگری LLM

آنچه شما نیاز دارید

  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب
  • مجوزهای IAM برای ارائه خدمات شبکه، مجموعه داده‌های BigQuery و منابع پلتفرم Agent
  • یک پوسته سازگار با POSIX ( bash یا zsh ) که رابط خط فرمان گوگل کلود (کامپوننت gcloud ) روی آن نصب شده باشد
  • ابزارهای خط فرمان: git ، curl ، jq (پردازشگر JSON)، پایتون ۳ و uv (مدیر بسته پایتون)

۲. مفاهیم

نقش‌های جهت ترافیک و دروازه

Agent Gateway به عنوان یک پروکسی شبکه آگاه از عامل عمل می‌کند، اما نقش عملیاتی آن بسته به جهت ترافیک تغییر می‌کند:

  • حالت عامل به هر کجا (خروجی): به عنوان یک پروکسی خروجی عمل می‌کند. هنگامی که یک عامل ابزارهای پایگاه داده خارجی، سرورهای MCP شخص ثالث یا APIها را فراخوانی می‌کند، دروازه خروجی، کشف سرویس، مسیریابی، TLS متقابل ( mTLS )، تزریق پویای اعتبارنامه‌های OAuth و کنترل دسترسی به نقاط انتهایی را مدیریت می‌کند.
  • حالت کلاینت به عامل (ورودی): به عنوان یک دروازه امنیتی frontend عمل می‌کند. هدف اصلی آن محافظت از ورودی به زمان اجرای عامل با رهگیری و پاکسازی پیام‌های ورودی زبان طبیعی قبل از رسیدن به کد عامل یا مدل‌های هوش مصنوعی است.

مسیر ورود به Agent Runtime

درخواست‌های کلاینت که یک عامل میزبانی‌شده در Agent Runtime را هدف قرار می‌دهند، به نقطه پایانی API مربوط به aiplatform.googleapis.com ارسال می‌شوند.

POST https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:query

این جریان ارتباطی ورودی به نقطه پایانی API، مسیر ورودی کلاینت به عامل را نشان می‌دهد.

برای ایمن‌سازی این مسیر ورودی تحت مدیریت گوگل، Agent Gateway مستقیماً با Google Front End ( GFE ) در لایه زیرساخت سرویس‌دهنده API ادغام می‌شود. هنگام استقرار یک عامل مدیریت‌شده در Agent Runtime، گوگل به‌طور بومی سیاست مجوزدهی دروازه ورودی را به درخواست‌های ورودی کلاینت در لبه شبکه متصل می‌کند.

شکل ۲

شکل ۲. مدیریت ورود با استفاده از Agent Gateway to Agent Runtime

از آنجا که بازرسی در لایه frontend قبل از ورود درخواست‌ها به Agent Runtime رخ می‌دهد، این معماری هیچ سربار شبکه‌ای اضافی یا تأخیر hop داخلی ایجاد نمی‌کند. مقیاس‌بندی به طور خودکار توسط زیرساخت frontend انجام می‌شود و نیاز به مدیریت محدوده‌های IP داخلی، متعادل‌کننده‌های بار یا مسیرهای DNS سفارشی را از بین می‌برد.

پاکسازی تهدیدات درون خطی با Model Armor

ارزیابی اعتبارنامه‌های تماس‌گیرنده و اعمال کنترل دسترسی IAM ( roles/aiplatform.user ) به صورت بومی توسط لایه میزبانی API aiplatform انجام می‌شود. خود دروازه ورودی، مجوز هویت را انجام نمی‌دهد، بلکه بر امنیت محتوا با استفاده از افزونه‌های مجوز پیکربندی شده با پروفایل CONTENT_AUTHZ تمرکز دارد. این دروازه به عنوان یک نقطه اجرای سیاست درون‌خطی عمل می‌کند و پیام‌های زبان طبیعی را در حین انتقال، قبل از رسیدن به حلقه استدلال عامل هوش مصنوعی یا LLM زیربنایی، رهگیری می‌کند.

وقتی یک درخواست کاربر ورودی به سرویس frontend می‌رسد، دروازه یک فراخوانی ext_proc (پردازش خارجی) را به سرویس توسعه مجوز منطقه‌ای Model Armor آغاز می‌کند که فراخوانی را به صفحه داده Model Armor ارسال می‌کند. Model Armor به عنوان یک فایروال زبان طبیعی عمل می‌کند و متن را در برابر قالب‌های فعال ارزیابی می‌کند تا خطرات ایمنی و امنیتی را اسکن کند:

  • تزریق‌های غیرمستقیم و تلاش‌های فرار از زندان
  • URL های مخرب، زبان سمی یا محتوای ناامن
  • اطلاعات شخصی قابل شناسایی ( PII ) و نشت داده‌های حساس

اگر الگو شامل فیلترهای حفاظت از داده‌های حساس ( SDP ) باشد، Model Armor یک فراخوانی gRPC اضافی به سرویس Cloud SDP انجام می‌دهد. Cloud SDP با استفاده از الگوی مشخص شده، محموله را بررسی می‌کند، هرگونه حذف هویت یا ویرایش درخواستی را انجام می‌دهد و نتیجه‌ی پاک‌سازی‌شده را به زنجیره برمی‌گرداند تا با خیال راحت ارسال شود.

اگر نقض خط‌مشی یا تطابق داده‌های حساسِ ویرایش‌نشده تشخیص داده شود، دروازه، بار داده را در لبه، قبل از ورود به زمان اجرا، مسدود یا ویرایش می‌کند. در نتیجه، برنامه عامل هوش مصنوعیِ در حال اجرا محافظت‌شده باقی می‌ماند و هرگز بارهای داده مخرب یا ویرایش‌نشده را پردازش نمی‌کند.

این بخش مفاهیم را به پایان می‌رساند... و در ادامه به بخش تنظیمات می‌پردازیم.

۳. راه‌اندازی

نقش‌های مورد نیاز IAM

برای ایجاد منابع در این Codelab، نقش‌های زیر مورد نیاز است:

دسته بندی

نقش IAM مورد نیاز (شناسه)

توضیحات

مدیریت API

roles/serviceusage.serviceUsageAdmin

فعال کردن سرویس‌های Google Cloud API

شبکه و درگاه

roles/networkservices.admin

دروازه عامل تأمین

افزونه‌های سرویس

roles/serviceextensions.admin

پیکربندی افزونه‌های مسیریابی

امنیت شبکه

roles/networksecurity.admin

استقرار سیاست‌های مجوزدهی

محافظت از داده‌های حساس

roles/dlp.admin

مدیریت بازرسی SDP و شناسایی الگوها

زره مدل

roles/modelarmor.admin

ایجاد و مدیریت الگوهای ایمنی

پلتفرم عامل

roles/aiplatform.admin

بارهای کاری Agent Runtime را مستقر کنید

فضای ذخیره‌سازی ابری

roles/storage.admin

مدیریت استقرار و داده‌های مشتری

مدیریت IAM

roles/resourcemanager.projectIamAdmin

اتصال مجوزهای سطح پروژه برای هویت عامل

گزارش‌ها و حسابرسی

roles/logging.viewer

بررسی ردپاها و گزارش‌های حسابرسی

روش دیگر، استفاده از یک نقش اساسی گسترده مانند roles/admin یا نقش قدیمی roles/owner .

به پروژه خود دسترسی پیدا کنید

این Codelab از یک پروژه Google Cloud واحد استفاده می‌کند. مراحل پیکربندی از gcloud CLI و دستورات پوسته لینوکس استفاده می‌کنند.

با دسترسی به خط فرمان پروژه Google Cloud خود شروع کنید:

شناسه پروژه خود را تنظیم کنید

gcloud config set project SET_YOUR_PROJECT_ID_HERE

احراز هویت جلسه

# login to gcloud cli
gcloud auth login
# login for gcloud api
gcloud auth application-default login

تنظیم متغیرهای محیطی پوسته

# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
echo ${SLUG}
echo ${REGION}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
export USER_IDENTITY=$(gcloud config get-value account)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
echo ${USER_IDENTITY}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-cta"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-crm"
export RE_AGENT_ID_SET="principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJ_NO}"
export STAGING_BUCKET="agent-staging-${PROJ_NO}"
export DATA_BUCKET="customer-data-${PROJ_NO}"
export MCP_URL="https://storage.mtls.googleapis.com/storage/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${DATA_BUCKET}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg

اگر نصب خودمدیریت‌شده‌ی Google Cloud SDK (یعنی خارج از Cloud Shell) را اجرا می‌کنید، اجزا را به آخرین نسخه به‌روزرسانی کنید.

# update gcloud cli
gcloud components update

فعال کردن سرویس‌های API

# enable google apis (agent platform bundle, part 1)
gcloud services enable \
  agentregistry.googleapis.com \
  aiplatform.googleapis.com \
  apphub.googleapis.com \
  apptopology.googleapis.com \
  cloudapiregistry.googleapis.com \
  cloudtrace.googleapis.com \
  compute.googleapis.com \
  dataform.googleapis.com \
  iam.googleapis.com \
  iamconnectors.googleapis.com \
  iap.googleapis.com \
  logging.googleapis.com \
  modelarmor.googleapis.com \
  monitoring.googleapis.com \
  networksecurity.googleapis.com \
  networkservices.googleapis.com \
  notebooks.googleapis.com \
  observability.googleapis.com
# enable google apis (agent platform bundle, part 2)
gcloud services enable \
  securitycenter.googleapis.com \
  saasservicemgmt.googleapis.com \
  storage.googleapis.com \
  telemetry.googleapis.com \
  texttospeech.googleapis.com
# enable google apis (all the rest)
gcloud services enable \
  dlp.googleapis.com

این بخش تنظیمات را به پایان می‌رساند... و در ادامه به بخش دروازه (Gateway) می‌پردازیم.

۴. دروازه

یک دروازه عامل تحت مدیریت گوگل را که در حالت کلاینت به عامل ( CLIENT_TO_AGENT ) کار می‌کند، مستقر کنید. برخلاف دروازه‌های خروجی که برای مسیریابی تماس‌های خروجی به ارتباطات رجیستری عامل نیاز دارند، دروازه ورودی مستقیماً در لایه فرانت‌اند متصل می‌شود تا به عنوان نقطه اجرای درون‌خطی برای اعلان‌های ورودی که Agent Runtime را هدف قرار می‌دهند، عمل کند.

در حالی که سیاست‌های خروجی اغلب در حالت DRY_RUN در لایه دروازه شروع می‌شوند، مدیریت محتوای ورودی ( CONTENT_AUTHZ ) مستقیماً در حالت اجباری پیاده‌سازی می‌شود. در عوض، ثبت وقایع فقط-ممیزی دانه‌ای یا مسدود کردن فعال، به صورت بالادستی در قالب‌های منفرد Model Armor کنترل می‌شوند.

ایجاد دروازه

# create agent gateway config file
cat > cfg/${AGW_NAME}.yaml <<EOF
name: ${AGW_NAME}
protocols:
  - MCP
googleManaged:
  governedAccessPath: CLIENT_TO_AGENT
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
  --source="cfg/${AGW_NAME}.yaml" \
  --location=${REGION}

تأیید درگاه

# list agent gateways (in region)
gcloud network-services agent-gateways list --location=${REGION}
# show agent gateway details (verify deployment state)
gcloud network-services agent-gateways describe ${AGW_NAME} --location=${REGION}

این بخش دروازه را به پایان می‌رساند... و در ادامه به بخش زره مدل می‌رسیم.

۵. زره مدل

الگوهای SDP

یک الگوی بازرسی و حذف هویت حفاظت از داده‌های حساس ( SDP ) ایجاد کنید تا در الگوی پاسخ Model Armor استفاده شود. این پیکربندی، شماره‌های تأمین اجتماعی ایالات متحده (SSN) را برای ویرایش علامت‌گذاری می‌کند.

ایجاد الگوی بازرسی

الگوی inspect اطلاعات حساس ( US_SOCIAL_SECURITY_NUMBER ) را در داده‌ها شناسایی می‌کند.

# create inspect template
curl -fsS -X POST "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" \
  -d @- << EOF
{
  "templateId": "agw-ssn-inspect-template",
  "inspectTemplate": {
    "displayName": "ssn inspect template",
    "inspectConfig": {
      "infoTypes": [
        { "name": "US_SOCIAL_SECURITY_NUMBER" }
      ],
      "minLikelihood": "POSSIBLE"
    }
  }
}
EOF

ایجاد الگوی عدم شناسایی

الگوی de-identify تبدیلی را که باید روی SSN های یافت شده توسط الگوی inspect اعمال شود، مشخص می‌کند. در این حالت، تبدیل، جایگزینی SSN با نوع info است.

# create de-identify template
curl -fsS -X POST "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" \
  -d @- << EOF
{
  "templateId": "agw-ssn-redaction-template",
  "deidentifyTemplate": {
    "displayName": "SSN Redaction Template",
    "deidentifyConfig": {
      "infoTypeTransformations": {
        "transformations": [{
          "primitiveTransformation": { "replaceWithInfoTypeConfig": {} }
        }]
      }
    }
  }
}
EOF

الگوهای SDP را تأیید کنید

# get (describe) inspect template
curl -fsS -X GET "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" | jq
# get (describe) de-identify template
curl -fsS -X GET "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" | jq

الگوهای زره ​​مدل

نقطه پایانی پیش‌فرض برای API مدل آرمور، جهانی است ( modelarmor.googleapis.com ). با این حال، منابع مدل آرمور برای قالب‌ها و موتورهای ارزیابی، به مناطق جغرافیایی خاصی محدود شده‌اند. پروکسی نقطه پایانی منطقه‌ای گوگل کلود (REP) یا نقطه پایانی API منطقه‌ای برای مدل آرمور، https://modelarmor.${LOCATION}.rep.googleapis.com/ است.

به طور پیش‌فرض، هنگام اجرای gcloud model-armor ... ، رابط خط فرمان (CLI) تلاش می‌کند درخواست‌های API را به نقطه پایانی استاندارد جهانی ( https://modelarmor.googleapis.com/ ) ارسال کند. یک override نقطه پایانی API برای هدایت مستقیم تمام درخواست‌های HTTP SDK/CLI برای Model Armor به لایه API منطقه‌ای rep.googleapis.com استفاده می‌شود، جایی که آن قالب‌های وابسته به مکان در واقع ایجاد، ذخیره و پرس‌وجو می‌شوند.

تنظیم لغو API

# set api endpoint override per location
gcloud config set api_endpoint_overrides/modelarmor "https://modelarmor.${REGION}.rep.googleapis.com/"

لغو API را تأیید کنید

# view api overrides on active gcloud config
gcloud config list api_endpoint_overrides/

ایجاد الگوی فیلتر درخواست

یک الگوی فیلتر درخواست ایجاد کنید تا سخنان نفرت‌پراکن، آزار و اذیت، محتوای صریح جنسی و حملات تزریق URI را مسدود کند. ثبت وقایع برای ثبت اطلاعات دقیق رویدادها در مورد اجرای سیاست‌ها فعال خواهد شد. کدهای خطا و پیام‌های سفارشی نیز برای زمانی که یک درخواست مسدود می‌شود، پیکربندی شده‌اند.

# create model armor template (request)
gcloud beta model-armor templates create ${AGW_NAME}-modar-req-template \
  --project=${PROJ_ID} \
  --location=${REGION} \
  --rai-settings-filters='[
    { "filterType": "HATE_SPEECH", "confidenceLevel": "MEDIUM_AND_ABOVE" },
    { "filterType": "HARASSMENT", "confidenceLevel": "MEDIUM_AND_ABOVE" },
    { "filterType": "SEXUALLY_EXPLICIT", "confidenceLevel": "MEDIUM_AND_ABOVE" }
  ]' \
  --pi-and-jailbreak-filter-settings-enforcement=enabled \
  --pi-and-jailbreak-filter-settings-confidence-level=medium-and-above \
  --template-metadata-enforcement-type=INSPECT_AND_BLOCK \
  --malicious-uri-filter-settings-enforcement=enabled \
  --template-metadata-custom-llm-response-safety-error-code=798 \
  --template-metadata-custom-llm-response-safety-error-message="ahoy! model response blocked by content filter :(" \
  --template-metadata-custom-prompt-safety-error-code=799 \
  --template-metadata-custom-prompt-safety-error-message="ahoy! the request was blocked by ye content filter... so rephrase the prompt and try again!" \
  --template-metadata-ignore-partial-invocation-failures \
  --template-metadata-log-operations \
  --template-metadata-log-sanitize-operations

ایجاد الگوی فیلتر پاسخ

یک الگوی فیلتر پاسخ ایجاد کنید تا محتوای مشابه الگوی فیلتر درخواست را مسدود کند. DLP در بخش پاسخ پیکربندی شده است تا SSN های پیام هایی را که از طرف عامل به کلاینت بازمی‌گردند، شناسایی نکند.

# create model armor template (response)
gcloud beta model-armor templates create ${AGW_NAME}-modar-resp-template \
  --project=${PROJ_ID} \
  --location=${REGION} \
  --rai-settings-filters='[
      { "filterType": "HATE_SPEECH", "confidenceLevel": "MEDIUM_AND_ABOVE" },
      { "filterType": "HARASSMENT", "confidenceLevel": "MEDIUM_AND_ABOVE" },
      { "filterType": "SEXUALLY_EXPLICIT", "confidenceLevel": "MEDIUM_AND_ABOVE" }
  ]' \
  --malicious-uri-filter-settings-enforcement=enabled \
  --advanced-config-inspect-template=projects/${PROJ_ID}/locations/${REGION}/inspectTemplates/agw-ssn-inspect-template \
  --advanced-config-deidentify-template=projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates/agw-ssn-redaction-template \
  --template-metadata-enforcement-type=INSPECT_AND_BLOCK \
  --template-metadata-custom-llm-response-safety-error-code=798 \
  --template-metadata-custom-llm-response-safety-error-message="ahoy! model response blocked by content filter :(" \
  --template-metadata-custom-prompt-safety-error-code=799 \
  --template-metadata-custom-prompt-safety-error-message="ahoy! the request was blocked by ye content filter... so rephrase the prompt and try again!" \
  --template-metadata-ignore-partial-invocation-failures \
  --template-metadata-log-operations \
  --template-metadata-log-sanitize-operations

الگوهای زره ​​مدل را تأیید کنید

# list model armor templates
gcloud model-armor templates list --location=${REGION}
# show request filter template details
gcloud model-armor templates describe ${AGW_NAME}-modar-req-template --location=${REGION}
# show response filter template details
gcloud model-armor templates describe ${AGW_NAME}-modar-resp-template --location=${REGION}

مجوزهای IAM

Model Armor فراخوانی‌های API را برای فراخوانی سرویس حفاظت از داده‌های حساس ( SDP ) انجام می‌دهد. مجوزهای IAM هویت سرویس Model Armor را برای استفاده از الگوهای بازرسی و شناسایی‌زدایی SDP اعطا کنید.

سیاست IAM را برای حفاظت از داده‌های حساس مقید کنید

# grant dlp (sdp) user role to the model armor service identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-modelarmor.iam.gserviceaccount.com" \
  --role="roles/dlp.user"

مجوزهای IAM را تأیید کنید

# show iam policy for all dlp (sdp) roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.role:roles/dlp" \
  --format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"

این بخش زره مدل را به پایان می‌رساند... و در کنار بخش مجوز قرار می‌گیرد.

۶. مجوز

مجوزهای IAM

برای بررسی ترافیک درون‌خطی با استفاده از Model Armor، عامل سرویس Service Extensions ( DEP ) به اتصالات صریح IAM (حتی در منابع درون یک پروژه) نیاز دارد:

  • roles/modelarmor.calloutUser و roles/serviceusage.serviceUsageConsumer : در پروژه‌ی گیت‌وی اعطا شده تا فراخوانی‌های بازرسی درون‌خطی را امکان‌پذیر کند.
  • roles/modelarmor.user : به پروژه‌ی الگو اعطا می‌شود تا امکان دسترسی و ارزیابی الگوهای Model Armor فراهم شود.

سیاست IAM را برای Model Armor مقید کنید

# grant model armor callout user role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --role="roles/modelarmor.calloutUser"

# grant service usage consumer role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --role="roles/serviceusage.serviceUsageConsumer"

# grant model armor user role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --role="roles/modelarmor.user"

مجوزهای IAM را تأیید کنید

# show iam policy on project for dep (service extension) service agent
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"

تمدید مجوز

پیکربندی افزونه‌ی مجوز برای Agent Gateway، تنظیمات یکپارچه‌سازی را که برای ترافیک ورودی و خروجی اعمال می‌شود، تعریف می‌کند. این پیکربندی، سرویس پردازش خارجی ( service ) را تعریف می‌کند که به API منطقه‌ای Model Armor ارجاع می‌دهد و با استفاده از فیلد فراداده‌ی model_armor_settings به الگوهای درخواست و پاسخ خاص پیوند می‌دهد.

ایجاد افزونه مجوز

# create authz extension config file (enforced mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-modar.yaml <<EOF
name: ${AGW_NAME}-svc-ext-authz-modar
service: modelarmor.${REGION}.rep.googleapis.com
metadata:
  model_armor_settings: '[
    {
      "request_template_id": "projects/${PROJ_ID}/locations/${REGION}/templates/${AGW_NAME}-modar-req-template",
      "response_template_id": "projects/${PROJ_ID}/locations/${REGION}/templates/${AGW_NAME}-modar-resp-template"
    }
  ]'
failOpen: true
timeout: 5s
EOF

افزونه authz را وارد کنید

# import authz extension file
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-modar \
  --source=cfg/${AGW_NAME}-svc-ext-authz-modar.yaml \
  --location=${REGION}

تأیید افزونه authz

# list authz extensions
gcloud service-extensions authz-extensions list --location=${REGION}
# show authz extension details
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-modar \
  --location=${REGION}

سیاست مجوز

سیاست‌های مجوزدهی از پروفایل‌های سیاست برای تعیین نوع ارزیابی انجام‌شده استفاده می‌کنند. در حالی که پروفایل‌های مبتنی بر درخواست ( REQUEST_AUTHZ ) هدرهای HTTP را ارزیابی می‌کنند، این پیکربندی از یک پروفایل مجوزدهی مبتنی بر محتوا ( CONTENT_AUTHZ ) برای اتصال افزونه Model Armor به دروازه برای بازرسی عمیق بار داده استفاده می‌کند.

ایجاد سیاست مجوز

# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-modar.yaml <<EOF
name: ${AGW_NAME}-authz-policy-modar
target:
  resources:
    - "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: CONTENT_AUTHZ
action: CUSTOM
customProvider:
  authzExtension:
    resources:
      - "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-modar"
EOF

سیاست وارد کردن مجوز

# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-modar \
  --source=cfg/${AGW_NAME}-authz-policy-modar.yaml \
  --location=${REGION}

سیاست authz را تأیید کنید

# list authz policies
gcloud beta network-security authz-policies list --location=${REGION}
# show authz policy details
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-modar \
  --location=${REGION}

این بخش مجوزدهی را که در کنار بخش Codebase قرار دارد، به پایان می‌رساند.

۷. کدبیس

کد عامل و داده‌های فایل مورد استفاده برای این Codelab در یک مخزن از راه دور Google Cloud GitHub نگهداری می‌شوند. مراحل زیر مخزن را به صورت محلی کلون می‌کند، فایل‌های لازم را در ساختار دایرکتوری کاری فعلی کپی می‌کند و سپس فایل‌های موقت را پاکسازی می‌کند.

مصنوعات از راه دور را دریافت کنید

# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_ingress_modar
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_ingress_modar/codelabs/agw-cuj-arun-ingress-modar/agent-crm ./agent-crm
# remove temporary directory
rm -rf temp_agw_cuj_arun_ingress_modar

یک سطل ذخیره‌سازی برای مرحله‌بندی توسط Agent Runtime برای آپلود، ساخت و استقرار کد برنامه عامل بسته‌بندی شده و مصنوعات وابستگی آن استفاده می‌شود.

ایجاد سطل ذخیره‌سازی برای مرحله‌بندی

# create storage bucket
gcloud storage buckets create gs://${STAGING_BUCKET}   --location=${REGION}   --uniform-bucket-level-access

سطل ذخیره‌سازی را تأیید کنید

# list storage buckets
gcloud storage buckets list --format="value(storage_url)"

این بخش کدبیس را به پایان می‌رساند... و در ادامه به بخش داده‌های مشتری GCS می‌پردازیم.

داده‌های مشتری

یک مخزن ذخیره‌سازی ابری برای ذخیره داده‌های مشتری ایجاد کنید. عامل مستقیماً با استفاده از کتابخانه استاندارد کلاینت گوگل کلود که نقطه پایانی Cloud Storage MCP را فراخوانی می‌کند، اطلاعات را می‌خواند.

ایجاد سطل ذخیره‌سازی برای داده‌های مشتری

# create storage bucket
gcloud storage buckets create gs://${DATA_BUCKET}   --location=${REGION}   --uniform-bucket-level-access

سطل ذخیره‌سازی را تأیید کنید

# list storage buckets
gcloud storage buckets list --format="value(storage_url)"

بارگذاری داده‌های مشتری

# copy local data to bucket
gcloud storage cp -r ./agent-crm/data/* gs://${DATA_BUCKET}/

تأیید داده‌های مشتری

# list bucket objects
gcloud storage ls gs://${DATA_BUCKET}/ --long

این بخش داده‌های مشتری GCS را به پایان می‌رساند... و در ادامه به بخش نماینده ADK می‌رسد.

۸. مامور ADK

ایجنت ADK مربوط به agent-crm که در Agent Runtime مستقر شده است، با تنظیمات زیر در اسکریپت استقرار پیکربندی شده است تا با Agent Platform ادغام شود:

  • "identity_type": types.IdentityType.AGENT_IDENTITY برای ارائه یک هویت اصلی منحصر به فرد مبتنی بر SPIFFE برای عامل
  • "client_to_agent_config": {"agent_gateway": "${AGW_URI}"} برای هدایت تمام ترافیک ورودی برای عامل به مسیر ارزیابی و اجرای سیاست Agent Gateway

همچنین آدرس اینترنتی سرور mTLS MCP برای سرور Cloud Storage MCP و نام سطل داده برای فراخوانی ابزار GCS MCP از طریق یک اتصال امن به عامل ارسال می‌شود.

عامل را مستقر کنید

# deploy agent
uv --directory agent-crm run python3 deploy_agent.py \
  --project=${PROJ_ID} \
  --region=${REGION} \
  --src-dir=./agent \
  --staging-bucket=${STAGING_BUCKET} \
  --display-name="${RE_AGENT_NAME}" \
  --description="agent for customer data" \
  --mcp-server-url="${MCP_URL}" \
  --data-bucket=${DATA_BUCKET} \
  --enable-telemetry \
  --enable-agent-identity \
  --agent-gateway-ingress=${AGW_URI} \
  --allow-token-sharing

تأیید استقرار

موارد حیاتی استقرار را دریافت کنید

# fetch agent runtime (reasoning engine) resource id
export RE_ENGINE_ID=$(curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  | jq -r --arg name "${RE_AGENT_NAME}" '.reasoningEngines[] | select(.displayName==$name) | .name | split("/") | last')
echo ${RE_ENGINE_ID}
# fetch agent runtime (reasoning engine) agent identity directly from reasoning engine
export RE_AGENT_IDENTITY="principal://$(curl -s \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
  | jq -r '.spec.effectiveIdentity')"
echo ${RE_AGENT_IDENTITY}

پیکربندی دروازه را تأیید کنید

# show agent runtime config details (gateway config)
curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  | jq '{displayName: .displayName, name: .name, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'

مجوزهای IAM

الزام به اعمال سیاست‌های IAM برای شناسایی عامل

# grant mcp tool user role to agent set (all agent runtime agents in project)
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_ID_SET}" \
  --role="roles/mcp.toolUser"
# grant storage object viewer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/storage.objectViewer"

# grant aiplatform user role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/aiplatform.user"

# grant cloudtrace agent role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/cloudtrace.agent"

# grant cloud monitoring metric writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/monitoring.metricWriter"
# grant cloud logging log writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/logging.logWriter"

# grant telemetry writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/telemetry.writer"

# grant service usage consumer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/serviceusage.serviceUsageConsumer"

# grant browser role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/browser"

مجوزهای IAM را تأیید کنید

# show agent identity roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members:${RE_AGENT_IDENTITY}" \
  --format="table(bindings.members.sub('^.*locations/', 'principal://agents.[...]/locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
# show agent set roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members:${RE_AGENT_ID_SET}" \
  --format="table(bindings.members.sub('^.*platformContainer/', 'principalSet://agents.[...]/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"

این بخش مربوط به عامل ADK را به پایان می‌رساند... و در ادامه به بخش تست می‌پردازیم.

۹. آزمون

ارسال کوئری‌ها از CLI

یک دستور امن را آزمایش کنید

# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
  -d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
  "input": {
    "message": "what are the names of our west customers?",
    "user_id": "test-user"
  }
}
EOF

باید پاسخی مانند ... "مشتریان غرب ما عبارتند از: باب جانسون و آلیس براون."

یک محرک ویرایش را آزمایش کنید

# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
  -d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
  "input": {
    "message": "what are ssn's for bob johnson and alice brown?",
    "user_id": "test-user"
  }
}
EOF

یک دستور امن دیگر را امتحان کنید

# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
  -d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
  "input": {
    "message": "what are bob johnson's and alice brown's email addresses?",
    "user_id": "test-user"
  }
}
EOF

گزارش‌های حسابرسی

مشاهده گزارش‌های ردیابی

وقتی تله‌متری فعال باشد، Agent Runtime رویدادهای ساختاریافته‌ای را که نشان‌دهنده‌ی پرس‌وجوهای کاربر، پارامترهای ابزار، جریان‌های اجرا و خروجی‌های انتخاب مدل هستند، استریم می‌کند.

# show agent runtime (reasoning engine) telemetry and trace logs
gcloud logging read \
  "logName:\"projects/${PROJ_ID}/logs/aiplatform.googleapis.com%2Freasoning_engine_stdout\" AND labels.managed-by=\"reasoning-engine\"" \
  --project=${PROJ_ID} \
  --limit=15 \
  --format="table(
    timestamp.date(format=\"%I:%M:%S %p\", tz=LOCAL):label=TIME,
    trace.basename().sub('^(.{8}).*$', '\\1'):label=TRACE_ID,
    labels.\"event.name\".scope(-1):label=EVENT,
    jsonPayload.content.role:label=ROLE,
    jsonPayload.content.parts[0].text:label=TEXT_CONTENT,
    jsonPayload.content.parts[0].function_call.name:label=TOOL_CALL
  )"

TRACE_ID پرس‌وجوی کاربر، فراخوانی‌های ابزار میانی و تصمیمات مدل را در یک جدول زمانی واحد گروه‌بندی می‌کند:

TIME         TRACE_ID  EVENT                  ROLE   TEXT_CONTENT                                     TOOL_CALL
HH:MM:SS PM  3070a1fd  gen_ai.choice          model  Bob Johnson's SSN is 219-45-7895.
                                                     Alice Brown's SSN is 219-45-7896.
HH:MM:SS PM  3070a1fd  gen_ai.user.message    user
HH:MM:SS PM  3070a1fd  gen_ai.user.message    model                                                   read_customer_file
HH:MM:SS PM  3070a1fd  gen_ai.user.message    user
HH:MM:SS PM  3070a1fd  gen_ai.user.message    model                                                   read_customer_file
HH:MM:SS PM  3070a1fd  gen_ai.user.message    user
HH:MM:SS PM  3070a1fd  gen_ai.user.message    model                                                   list_customer_files
HH:MM:SS PM  3070a1fd  gen_ai.user.message    user   what are ssn's for bob johnson and alice brown?
HH:MM:SS PM  3070a1fd  gen_ai.system.message
HH:MM:SS PM  3070a1fd  gen_ai.choice          model                                                   read_customer_file

مشاهده گزارش‌های پاکسازی زره ​​مدل

این گزارش‌ها، تهدیدات درون‌خطی دوطرفه و پاکسازی انجام‌شده توسط Model Armor را در زمان واقعی و همزمان با عبور ترافیک از Agent Gateway نشان می‌دهند.

# show model armor logs
gcloud logging read \
  "logName:\"projects/${PROJ_ID}/logs/modelarmor.googleapis.com%2Fsanitize_operations\"" \
  --project=${PROJ_ID} \
  --limit=50 \
  --format="table(
    timestamp.date(format=\"%I:%M:%S %p\", tz=LOCAL):label=TIME,
    jsonPayload.sanitizationResult.sanitizationVerdict:label=VERDICT,
    jsonPayload.sanitizationInput.byteItem.byteData.decode(base64).decode(utf-8).sub('\n', ' \\\\\\\\n ').trailoff(123):label=INPUT_DATA
  )"

به ورودی گزارش مربوط به درخواست‌های پاکسازی‌شده و مسدودشده توجه کنید.

TIME         VERDICT                                 INPUT_DATA
HH:MM:SS PM  MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW  Bob Johnson's email address is bob.j@example.com. \n Alice Brown's email address is alice.b...
HH:MM:SS PM  MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW  what are bob johnson's and alice brown's email addresses?
HH:MM:SS PM  MODEL_ARMOR_SANITIZATION_VERDICT_BLOCK  6��
HH:MM:SS PM  MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW  what are ssn's for bob johnson and alice brown?
HH:MM:SS PM  MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW  Our west customers are: Bob Johnson and Alice Brown.
HH:MM:SS PM  MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW  what are the names of our west customers?

این بخش تست را به پایان می‌رساند... و پس از آن بخش پاکسازی قرار دارد.

۱۰. پاکسازی

# remove agent iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/storage.objectViewer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/aiplatform.user"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/cloudtrace.agent"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/monitoring.metricWriter"

# next
# remove more agent and agent set iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/logging.logWriter"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/telemetry.writer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/serviceusage.serviceUsageConsumer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/browser"

# next
# remove rest of iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_ID_SET}" --role="roles/mcp.toolUser"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="serviceAccount:service-${PROJ_NO}@gcp-sa-modelarmor.iam.gserviceaccount.com" --role="roles/dlp.user"

# next
# delete agent runtime (reasoning engine) agent
curl -s -X DELETE "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}?force=true" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json"

# next
# delete storage
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}
gcloud -q storage rm --recursive gs://${DATA_BUCKET}

# next
# delete authz resources
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-modar --location=${REGION}

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-modar --location=${REGION} --async

# next
# remove dep (service extensions) service agent iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --role="roles/modelarmor.calloutUser"

gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --role="roles/serviceusage.serviceUsageConsumer"

gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
  --role="roles/modelarmor.user"

# next
# delete model armor templates
gcloud -q model-armor templates delete ${AGW_NAME}-modar-resp-template --location=${REGION}
gcloud -q model-armor templates delete ${AGW_NAME}-modar-req-template --location=${REGION}

# unset model armor api endpoint override
gcloud config unset api_endpoint_overrides/modelarmor

# next
# delete sdp (dlp) templates
curl -fsS -X DELETE "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates/agw-ssn-redaction-template" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "x-goog-user-project: ${PROJ_ID}"

curl -fsS -X DELETE "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates/agw-ssn-inspect-template" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "x-goog-user-project: ${PROJ_ID}"

# next
# delete agent gateway ingress
gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION} --async

# end

این بخش پاکسازی را به پایان می‌رساند... که در ادامه به بخش نتیجه‌گیری خواهیم پرداخت.

۱۱. نتیجه‌گیری

تبریک! شما با موفقیت Agent Gateway را مستقر کرده و ترافیک ورودی به یک عامل هوش مصنوعی را مدیریت کرده‌اید!

کازموپاپ

کازموپاپ فکر می‌کند که Codelabs خیلی مشتاق است!

قدم بعدی چیست؟

با استفاده از این فرم بازخورد، می‌توانید هرگونه نظر، سوال یا اصلاحیه‌ای را ارائه دهید.

متشکرم!