G-gen ã®äœã
æšã§ããåœèšäºã§ã¯ãAgent Development KitïŒADKïŒã§éçºãã AI ãšãŒãžã§ã³ãã§ Agent RuntimeïŒæ§ç§° : Vertex AI Agent EngineïŒã® Memory Bank æ©èœã䜿çšããããšã§ãã»ãã·ã§ã³éã§æ
å ±ãä¿æã§ãããšãŒãžã§ã³ããæ§ç¯ããŠãããŸãã æ§æ åœèšäºã§äœ¿çšãããã® Agent Development KitïŒADKïŒ Agent Runtime Memory Bank Cloud Run Memory Bank ã䜿çšãããšãŒãžã§ã³ãã®éçº ãšãŒãžã§ã³ãã®æŠèŠ ãã£ã¬ã¯ããªæ§æ ãããžã§ã¯ãã®æºå ãšãŒãžã§ã³ãã®ãœãŒã¹ã³ãŒãïŒagent.pyïŒ Agent Runtime ã«ãšãŒãžã§ã³ããããã〠Google Cloud ã®èªèšŒãšèšå® .env ãã¡ã€ã«ã®äœæ Agent Runtime ãžã®ããã〠åäœç¢ºèªïŒADK WebïŒ ããã³ããšã³ãã®æ§ç¯ ããã³ããšã³ãã®æŠèŠ ãã£ãããããã®éçº ãã£ã¬ã¯ããªæ§æ ãããžã§ã¯ãã®æºå app.py Dockerfile OAuth åæç»é¢ã®æ§æ Cloud Run ãžã®ããã〠ãµãŒãã¹ã¢ã«ãŠã³ãã®äœæ ããã〠åäœç¢ºèª Memory Bank ã®ã«ã¹ã¿ãã€ãº ã«ã¹ã¿ãã€ãºã®æŠèŠ ã«ã¹ã¿ãã€ãºçšã¹ã¯ãªããïŒupdate.pyïŒã®äœæ ã«ã¹ã¿ãã€ãºã®é©çš ã«ã¹ã¿ãã€ãºåŸã®åäœç¢ºèª æ§æ åœèšäºã§ã¯ã Agent Development Kit ïŒADKïŒã§å®çŸ©ãã AI ãšãŒãžã§ã³ãã Agent Runtime ã«ãããã€ãããŸããããã³ããšã³ããšããŠãšãŒãžã§ã³ããšããåããè¡ããã£ãããããã Cloud Run ã«æ§ç¯ããŠãããŸãã ãšãŒãžã§ã³ãã¯ãAgent Platform ã® Memory Bank æ©èœã䜿çšããããã«æ§ç¯ããŸããããã«ãããäžåºŠãã£ããããããšã®äŒè©±ãçµäºããåŸã§ããåã®äŒè©±å
容ã®äžéšãé·æèšæ¶ãšã㊠Memory Bank ã«ä¿åããŠããããšãã§ããŸãã ãŸããCloud Run ã§ã¯ Identity-Aware Proxy ïŒIAPïŒãæå¹åããããšã§ãGoogle ã¢ã«ãŠã³ãã§èªèšŒããããŠãŒã¶ãŒã®ã¿ããã£ããããããå©çšã§ããããã«ããŸãããã®äžã§ãIAP ãä»äžããèªèšŒæžã¿ãŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ã user_id ãšã㊠Memory Bank ã«éä¿¡ããããšã§ããŠãŒã¶ãŒããšã®èšæ¶ã Memory Bank ã«èç©ã§ããããã«ããŸãã Memory Bank æ©èœã䜿çšãã Agent Runtime ãšãã£ãããããã®æ§æ åœèšäºã§äœ¿çšãããã® Agent Development KitïŒADKïŒ Agent Development Kit ïŒADKïŒã¯ãGoogle Cloud ãæäŸãã AI ãšãŒãžã§ã³ãæ§ç¯ã®ããã®ãªãŒãã³ãœãŒã¹ ãã¬ãŒã ã¯ãŒã¯ã§ãããåçŽãªã¿ã¹ã¯ãããªããšãŒãžã§ã³ãããè€æ°ã®ãšãŒãžã§ã³ããååããè€éãªã¯ãŒã¯ãããŒãŸã§å®¹æã«å®è£
ã§ããŸãã ADK ã«ã¯ãMemory Bank ãšé£æºããããã® PreloadMemoryTool ããã»ãã·ã§ã³ã€ãã³ãã Memory Bank ã«éä¿¡ããããã® add_events_to_memory() ãšãã£ããŠãŒãã£ãªãã£ãæšæºã§çµã¿èŸŒãŸããŠãããé·æèšæ¶ãæ±ããšãŒãžã§ã³ããå°ãªãã³ãŒãã§å®è£
ã§ããŸãã åè : Agent Development Kit åè : Agent Development Kit ã®æŠèŠ Agent Runtime Agent Runtime 㯠Gemini Enterprise Agent Platform ïŒæ§ç§° : Vertex AIãä»¥äž Agent Platform ãšèšèŒïŒã§æäŸããããµãŒãã¹ã®1ã€ã§ãããAI ãšãŒãžã§ã³ãã®å®è¡åºç€ãæäŸãããã«ãããŒãžããµãŒãã¹ã§ãã Agent Runtime ã§ã¯ããšãŒãžã§ã³ããšã®ãã«ãã¿ãŒã³äŒè©±ãå®çŸããããã®çµã¿èŸŒã¿ã® ã»ãã·ã§ã³æ©èœ ãå©çšããããšãã§ããã»ããMemory Bank ã®ããã«ããšãŒãžã§ã³ãã®æ©èœæ¡åŒµã«å¿
èŠãªæ§ã
ãªæ©èœãæäŸãããŠããŸãã Agent Runtime ã®è©³çްã«ã€ããŠã¯ã以äžã®èšäºããäžèªãã ããã blog.g-gen.co.jp Memory Bank Memory Bank 㯠Agent Platform ãæäŸãã é·æèšæ¶ ãå®çŸããããã®æ©èœã§ããAgent Runtime ã®ã»ãã·ã§ã³æ©èœãäžé£ã®äŒè©±ã®äžã§ã®çæçãªèšæ¶ãæ±ãã®ã«å¯ŸããMemory Bank ã¯ã»ãã·ã§ã³ããŸããã§å©çšã§ããèšæ¶ãèç©ããŸãã Memory Bank ã¯å
éšçã« LLM ãçšããŠãã»ãã·ã§ã³ã®ã€ãã³ãïŒäŒè©±å±¥æŽïŒãããŠãŒã¶ãŒã®å奜ãäºå®ãæœåºã»èŠçŽãããšãŒãžã§ã³ããèªèããŠãããŠãŒã¶ãŒ IDïŒ user_id ïŒåäœã§ä¿åããŸããããã«ããããšãŒãžã§ã³ããšã®äŒè©±ïŒã»ãã·ã§ã³ïŒãäžåºŠäžæããŠããåŸã®äŒè©±ã§ãŠãŒã¶ãŒããšã«ããŒãœãã©ã€ãºãããå¿çãè¿ãããšãã§ãããšãŒãžã§ã³ããæ§ç¯ã§ããŸãã ãšãŒãžã§ã³ãåŽãã以äžã®2ã€ã®æäœãè¡ãããšã§ Memory Bank ãå©çšã§ããŸãã èšæ¶ã®çæã»ä¿å : ã»ãã·ã§ã³äžã®ã€ãã³ãã Memory Bank ã«éä¿¡ããé·æèšæ¶ãšããŠæœåºã»ä¿åããã èšæ¶ã®åç
§ : æ°ããã»ãã·ã§ã³ã®éå§æãäŒè©±äžã«ãMemory Bank ããé¢é£ããèšæ¶ãååŸããããã³ããã«å«ã㊠LLM ã«æž¡ã ADK ã§ã¯ãããã®æäœãç°¡åã«è¡ãããã® add_events_to_memory() ã PreloadMemoryTool ãšãã£ããŠãŒãã£ãªãã£ãæäŸãããŠããããšãŒãžã§ã³ãã®ã³ãŒã«ããã¯ãããŒã«ãšããŠçµã¿èŸŒãã ãã§ Memory Bank ãå©çšã§ããŸãã åè : Agent Platform ã¡ã¢ãªãã³ã¯ Cloud Run Cloud Run 㯠Google Cloud ã®ãããŒãžããªã³ã³ããå®è¡ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ããããµãŒããŒã¬ã¹ ã³ã³ããã³ã³ãã¥ãŒãã£ã³ã° ãµãŒãã¹ã§ãã åœèšäºã§ã¯ãŠãŒã¶ãŒããšãŒãžã§ã³ããšããåãããããã®ããã³ããšã³ããšããŠäœ¿çšããŸãã Cloud Run ã®è©³çްã«ã€ããŠã¯ã以äžã®èšäºããäžèªãã ããã blog.g-gen.co.jp Memory Bank ã䜿çšãããšãŒãžã§ã³ãã®éçº ãšãŒãžã§ã³ãã®æŠèŠ åœèšäºã§ã¯ãã³ãŒããŒã«é¢ãã質åã«åçãããã³ãŒããŒãšãŒãžã§ã³ããã ADK ã§æ§ç¯ããŠãããŸãããšãŒãžã§ã³ãã Memory Bank ãšé£æºã§ããããã«å®è£
ããããšã§ããŠãŒã¶ãŒããšã®å奜ãéå»ã®ããåããé·æèšæ¶ãšããŠèç©ã§ããããã«ããŸãã Agent Runtime ã䜿çšããŠãšãŒãžã§ã³ããæ§ç¯ãã ãã£ã¬ã¯ããªæ§æ æçµçãªãã£ã¬ã¯ããªæ§æã¯ä»¥äžã®éãã«ãªããŸãã coffee_agent ãã£ã¬ã¯ããªã§ AI ãšãŒãžã§ã³ããå®è£
ããŠãããŸãã . âââ coffee_agent â âââ agent.py â âââ .env â âââ __init__.py âââ pyproject.toml # èªåã§äœæ âââ uv.lock # èªåã§äœæ ADK ã§ã¯ãšãŒãžã§ã³ãã®ããã±ãŒãžïŒããã§ã¯ coffee_agent ãã£ã¬ã¯ããªïŒå
ã« agent.py ãé
眮ããããã«ããŒã«é¢æ°ãšãšãŒãžã§ã³ãå®çŸ©ãå®è£
ããŸãã ãããžã§ã¯ãã®æºå ãšãŒãžã§ã³ãéçºçšã®ãã£ã¬ã¯ããªã§ãããžã§ã¯ããåæåããŸãã # uv ãããžã§ã¯ãåæå $ uv init --no-readme # ããã±ãŒãžã®è¿œå $ uv add " google-adk>=1.29.0 " 次ã«ããšãŒãžã§ã³ãçšã®ããã±ãŒãžãã£ã¬ã¯ããªïŒ coffee_agent ïŒãäœæããADK ãããã±ãŒãžãšããŠèªèã§ããããã« __init__.py ãé
眮ããŸãã __init__.py ã§ã¯ agent ã¢ãžã¥ãŒã«ãã€ã³ããŒãããŠããããšã§ã adk ã³ãã³ããããšãŒãžã§ã³ããåç
§ã§ããããã«ãªããŸãã # ãšãŒãžã§ã³ãã®ããã±ãŒãžãã£ã¬ã¯ããªãäœæ $ mkdir coffee_agent # __init__.py ãäœæ $ cat <<EOF > coffee_agent/__init__.py from . import agent EOF ãšãŒãžã§ã³ãã®ãœãŒã¹ã³ãŒãïŒagent.pyïŒ åœèšäºã§ã¯ãGoogle æ€çŽ¢ã§ã³ãŒããŒã«é¢ããæ
å ±ã調ã¹ããµããšãŒãžã§ã³ããããŒã«ãšããŠå
å
ãããšãŒãžã§ã³ããæ§ç¯ããMemory Bank ãšã®é£æºæ©èœãçµã¿èŸŒã¿ãŸãã Memory Bank ãšé£æºããããã«ã以äžã®2ã€ã®ä»çµã¿ãå©çšããŠããŸãã PreloadMemoryTool : ADK ãæšæºæäŸããããŒã«ã§ããšãŒãžã§ã³ãã®å®è¡éå§æã« Memory Bank ãã user_id ã«çŽä»ãèšæ¶ãååŸããããã³ããã«èªåã§æ¿å
¥ããŸãããšãŒãžã§ã³ãã¯éå»ã®äŒè©±ã®æèãèžãŸããå¿çãå¯èœã«ãªããŸãã after_agent_callback : ãšãŒãžã§ã³ãã®å¿çãå®äºããçŽåŸã«åŒã³åºãããã³ãŒã«ããã¯ã§ãã callback_context.add_events_to_memory() ãéããŠãçŽè¿ã®ã»ãã·ã§ã³ã€ãã³ãã Memory Bank ã«éä¿¡ããèšæ¶ãšããŠæœåºã»ä¿åãããŠããŸãã generate_memories_callback ã§ã¯ callback_context.session.events[-5:-1] ã®ããã«çŽè¿ã®ã€ãã³ããã¹ã©ã€ã¹ããŠéä¿¡ããŠããŸããããã«ãããå¿çå®äºæã®æçµã€ãã³ããé€å€ãã€ã€ããŠãŒã¶ãŒã®çºè©±ãšãšãŒãžã§ã³ãã®å¿çãå«ãçŽè¿ã®ããåãã®ã¿ã Memory Bank ã«éä¿¡ããŸãã from google.adk.agents import Agent from google.adk.tools import google_search from google.adk.tools.agent_tool import AgentTool from google.adk.agents.callback_context import CallbackContext from google.adk.tools.preload_memory_tool import PreloadMemoryTool # èšæ¶ã Memory Bank ã«ä¿åããã³ãŒã«ããã¯é¢æ° async def generate_memories_callback (callback_context: CallbackContext): # ã€ãã³ãåäœã§ Memory Bank ã«éä¿¡ãã await callback_context.add_events_to_memory( events=callback_context.session.events[- 5 :- 1 ]) return None # Web æ€çŽ¢çšãšãŒãžã§ã³ã search_agent = Agent( name= "search_agent" , model= "gemini-2.5-flash" , description= "Googleæ€çŽ¢ã§ã³ãŒããŒã«é¢ããæ
å ±ã調ã¹ããšãŒãžã§ã³ã" , instruction= "ãŠãŒã¶ãŒã®è³ªåã«å¯ŸããŠGoogleæ€çŽ¢ã䜿ã£ãŠæ
å ±ãåéããæ¥æ¬èªã§åçããŠãã ããã" , tools=[google_search] ) # ã«ãŒããšãŒãžã§ã³ã root_agent = Agent( name= "coffee_agent" , model= "gemini-2.5-flash" , description= "ã³ãŒããŒã«é¢ããæ
å ±ãåéãããšãŒãžã§ã³ã" , instruction= """ããªãã¯ã³ãŒããŒã®å°éå®¶ã¢ã·ã¹ã¿ã³ãã§ãã ãŠãŒã¶ãŒããã®è³ªåã«å¯ŸããŠãsearch_agentãæŽ»çšããªããã³ãŒããŒã«é¢ããæ£ç¢ºã§æçãªæ
å ±ãæäŸããŠãã ããã 察å¿ã§ãããããã¯ã®äŸ: - ã³ãŒããŒè±ã®ç£å°ã»åçš®ã»ç¹åŸŽ - æœåºæ¹æ³ïŒããªããããšã¹ãã¬ããœããã¬ã³ããã¬ã¹ãªã©ïŒ - çç
床åããšå³ããã®éã - ã«ãã§ãã³ãŒããŒã·ã§ããã®æ
å ± - ã³ãŒããŒã®å¥åº·å¹æãæŽå² - ã©ãã¢ãŒããããªã¹ã¿ã®æè¡ åçã¯æ¥æ¬èªã§ãããããããäžå¯§ã«è¡ã£ãŠãã ããã""" , tools=[ AgentTool(agent=search_agent), PreloadMemoryTool() ], after_agent_callback=generate_memories_callback ) åè : Agent Development Kit ã«ããã¯ã€ãã¯ã¹ã¿ãŒã Agent Runtime ã«ãšãŒãžã§ã³ããããã〠Google Cloud ã®èªèšŒãšèšå® ãããã€ã®åã«ãGoogle Cloud CLI ã§ã®èªèšŒãè¡ã£ãŠãããŸãã # ãããžã§ã¯ã ID ãç°å¢å€æ°ã«ã»ãã $ export PROJECT_ID = < ãããžã§ã¯ãID > # èªèšŒ $ gcloud auth login $ gcloud auth application-default login # ãããžã§ã¯ãã®èšå® $ gcloud config set project $PROJECT_ID .env ãã¡ã€ã«ã®äœæ ãšãŒãžã§ã³ãã®å®è¡æã« Gemini Enterprise Agent Platform ïŒæ§ç§° : Vertex AIãä»¥äž Agent Platform ãšèšèŒïŒãå©çšããããã®ç°å¢å€æ°ãã coffee_agent ãã£ã¬ã¯ããªé
äžã® .env ãã¡ã€ã«ã«èšå®ããŸããADK ã¯å®è¡æã«ãã®ãã¡ã€ã«ãèªåã§èªã¿èŸŒã¿ãŸãã # coffee_agent/.env ãäœæ $ cat <<EOF > coffee_agent/.env GOOGLE_GENAI_USE_VERTEXAI=1 GOOGLE_CLOUD_PROJECT= $PROJECT_ID GOOGLE_CLOUD_LOCATION=asia-northeast1 EOF GOOGLE_GENAI_USE_VERTEXAI : 1 ãæå®ããããšã§ãGemini API ã§ã¯ãªã Agent Platform çµç±ã§ Gemini ã¢ãã«ãå©çšããŸã GOOGLE_CLOUD_PROJECT : ãšãŒãžã§ã³ãããããã€ãã Google Cloud ãããžã§ã¯ã ID GOOGLE_CLOUD_LOCATION : Agent Runtime ããã³ã¢ãã«ãå©çšãããªãŒãžã§ã³ Agent Runtime ãžã®ããã〠adk deploy ã³ãã³ãã䜿çšããŠãAgent Runtime ã«ãšãŒãžã§ã³ãããããã€ããŸãã # Agent Runtime ã«ãšãŒãžã§ã³ããããã〠$ uv run adk deploy agent_engine \ --project = $PROJECT_ID \ --region = asia-northeast1 \ --display_name =" Coffee Agent " \ coffee_agent ãããã€ãæåãããšã以äžã®ããã« Agent Runtime ã®ãªãœãŒã¹åãåºåãããŸãã â
Created agent engine: projects/ < ãããžã§ã¯ãçªå· > /locations/asia-northeast1/reasoningEngines/ < ãšãŒãžã§ã³ãåºæã®æ°å > ãã®ãªãœãŒã¹åã¯ãåŸç¶ã®åäœç¢ºèªããã£ãããããã®ãããã€æã«äœ¿çšãããããã·ã§ã«å€æ°ã«ã»ããããŠãããŸãã # ç°å¢å€æ°ã«ãªãœãŒã¹åãã»ãã $ export RESOURCE_NAME =projects/ < ãããžã§ã¯ãçªå· > /locations/asia-northeast1/reasoningEngines/ < ãšãŒãžã§ã³ãåºæã®æ°å > ãªãããã§ã«ãããã€æžã¿ã® Agent Runtime ãæŽæ°ããå Žåã¯ã --agent_engine_id ãªãã·ã§ã³ã§ãªãœãŒã¹åãæå®ããŠåã adk deploy ã³ãã³ããå®è¡ããŸãã # æ¢åã® Agent Runtime ãæŽæ°ããå Žå $ uv run adk deploy agent_engine \ --project = $PROJECT_ID \ --region = asia-northeast1 \ --agent_engine_id = $RESOURCE_NAME \ --display_name =" Coffee Agent " \ coffee_agent åè : ADK CLI documentation - deploy åäœç¢ºèªïŒADK WebïŒ ããŒã«ã«ã§ ADK Web UI ãèµ·åããMemory Bank ãšé£æºããç¶æ
ã§ãšãŒãžã§ã³ãã®åäœã確èªããŸãã --memory_service_uri ãªãã·ã§ã³ã« Agent Runtime ã®ãªãœãŒã¹åãæå®ããããšã§ãããŒã«ã«ã® Web UI ãã Agent Runtime ã® Memory Bank ããšãŒãžã§ã³ãã®é·æèšæ¶ã¹ãã¢ãšããŠå©çšã§ããŸãïŒãšãŒãžã§ã³ãã¯ããŒã«ã«ã§å®è¡ããMemory Bank çšéã§ã®ã¿ Agent Runtime ã«ã¢ã¯ã»ã¹ããŠããç¶æ
ïŒã # Memory Bank ãæå®ã㊠ADK Web UI ãèµ·å $ uv run adk web --memory_service_uri = agentengine:// $RESOURCE_NAME ãã©ãŠã¶ã§ http://localhost:8000 ãéãããã£ããã§ãšãŒãžã§ã³ããšäŒè©±ããŸãã adk web ããèµ·åããå ŽåãMemory Bank ã«ã¯ user ãšããåºå®ã®ãŠãŒã¶ãŒ ID ã§èšæ¶ãä¿åãããŠãããŸãã ãŸãæåã®ã»ãã·ã§ã³ã§ã¯ãã³ãŒããŒã®å¥œã¿ïŒäŸ: ãç§ã¯é
žå³ã®åŒ·ãã³ãŒããŒã奜ãã§ããããããã®ã³ãŒããŒè±ã¯ãããŸãããïŒããšãŒãžã§ã³ãã«äŒããŸãã æåã®ã»ãã·ã§ã³ã§ãšãŒãžã§ã³ãã«å¥œã¿ãäŒãã Agent Runtime ã®ã³ã³ãœãŒã«ãã Memory Bank ã®äžèº«ã確èªããããšãã§ããŸããADK Web ã®ãŠãŒã¶ãŒïŒ user ïŒã«é¢ããèšæ¶ãšããŠããç§ã¯é
žå³ã®åŒ·ãã³ãŒããŒã奜ãã§ããããšããæ
å ±ãèšé²ãããŠããŸãã Memory Bank ã«å¥œã¿ã«é¢ããæ
å ±ãèšé²ãããŠãã ãã®åŸãADK Web UI äžã§æ°ããã»ãã·ã§ã³ãéå§ãããç§ã®å¥œã¿ã«åãæœåºæ¹æ³ãæããŠããªã©ãšè³ªåããããšã§ãMemory Bank ã«ä¿åãããŠããå人çãªå¥œã¿ã«é¢ããæ
å ±ãèžãŸããå¿çãè¿ã£ãŠããããšã確èªã§ããŸãã æåã®ã»ãã·ã§ã³ã§äŒãã奜ã¿ã«é¢ããæ
å ±ãæ°ããã»ãã·ã§ã³ã«åŒãç¶ãããŠãã åè : ADK CLI documentation - web ããã³ããšã³ãã®æ§ç¯ ããã³ããšã³ãã®æŠèŠ æ©æ¢°åŠç¿ã¢ãã«ã®ãã¢çš Web UI ã容æã«äœæã§ãã Gradio ãšãã Python ã©ã€ãã©ãªã䜿çšããŠãã£ããããããå®è£
ããŸãã ãã£ããããã Cloud Run ã«ãããã€ããWeb ãµãŒãã¹ãšããŠå
¬éã§ããããã«ããŸããCloud Run ã§ã¯ Identity-Aware ProxyïŒIAPïŒãæå¹åããGoogle ã¢ã«ãŠã³ãã§èªèšŒããããŠãŒã¶ãŒã®ã¿ãã¢ã¯ã»ã¹ã§ããããã«ããŸãã IAP ã«ããèªèšŒã€ãã®ãã£ããããããæ§ç¯ãã åè : Gradio ãã£ãããããã®éçº ãã£ã¬ã¯ããªæ§æ ããã³ããšã³ãã¯ãšãŒãžã§ã³ããšã¯å¥ã®ãã£ã¬ã¯ããªã§æ§ç¯ããŸããæçµçãªãã£ã¬ã¯ããªæ§æã¯ä»¥äžã®éãã«ãªããŸãã app.py ã«ãã£ããããããå®è£
ããŠãããŸãã . âââ app.py âââ Dockerfile âââ pyproject.toml # èªåã§äœæ âââ uv.lock # èªåã§äœæ ãããžã§ã¯ãã®æºå ãšãŒãžã§ã³ããšã¯å¥ã®ãã£ã¬ã¯ããªã§ uv ãããžã§ã¯ããåæåããŸãã # uv ãããžã§ã¯ãåæå $ uv init --no-readme # ããã±ãŒãžã®è¿œå $ uv add " google-cloud-aiplatform[agent-engines]>=1.142.0 " " gradio>=5.29 " app.py app.py ã§ã¯ä»¥äžã®åŠçãå®è£
ããŠããŸãã vertexai.init() ã§ Agent Platform ã«æ¥ç¶ãã agent_engines.get() ã§ Agent Runtime ã«ãããã€ãããšãŒãžã§ã³ããååŸ IAP ãä»äžãããªã¯ãšã¹ããããïŒ x-goog-authenticated-user-email ïŒãããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ãåãåºããAgent Runtime ã®ã»ãã·ã§ã³ããã³ Memory Bank ã® user_id ãšããŠäœ¿çš Agent Runtime ã®ã»ãã·ã§ã³æ©èœïŒ create_session ïŒã䜿ãããŠãŒã¶ãŒããšã«ãã«ãã¿ãŒã³ã®äŒè©±ã管ç agent.stream_query() ã§ãšãŒãžã§ã³ãã«ã¡ãã»ãŒãžãéä¿¡ããã¹ããªãŒãã³ã°ã§å¿çãåä¿¡ gr.Blocks ã§ Gradio ã®ãã£ãã UI ãæ§ç¯ Memory Bank ã®èšæ¶ã¯ user_id ããšã«åé¢ããŠä¿åãããããã user_id ã®æ±ºãæ¹ããã®ãŸãŸãŠãŒã¶ãŒããšã®ããŒãœãã©ã€ãºã®åäœãšãªããŸããããã§ã¯ IAP ãä»äžããèªèšŒæžã¿ã¡ãŒã«ã¢ãã¬ã¹ããã®ãŸãŸ user_id ãšããŠçšããããšã§ããã©ãŠã¶ãããã€ã¹ããŸããã§ãåäžãŠãŒã¶ãŒã§ããã°äžè²«ããèšæ¶ãåç
§ã§ããæ§æã«ããŠããŸãã import os import gradio as gr import vertexai from vertexai import agent_engines AGENT_ENGINE_ID = os.environ[ "AGENT_ENGINE_ID" ] # Identity-Aware Proxy (IAP) ãèªèšŒæžã¿ãŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ãä»äžããããã IAP_EMAIL_HEADER = "x-goog-authenticated-user-email" def get_agent (): vertexai.init( project=os.environ.get( "GOOGLE_CLOUD_PROJECT" ), location=os.environ.get( "GOOGLE_CLOUD_LOCATION" ), ) return agent_engines.get(AGENT_ENGINE_ID) agent = get_agent() # IAP ããæž¡ããããªã¯ãšã¹ãããããå
ã«ãŠãŒã¶ãŒãäžæã«ç¹å®ãã def get_user_id (request: gr.Request) -> str : # IAP 㯠"accounts.google.com:user@example.com" ã®åœ¢åŒã§ä»äžããããã # ãã¬ãã£ãã¯ã¹ãé€å»ããŠã¡ãŒã«ã¢ãã¬ã¹éšåã®ã¿ãåãåºã raw = request.headers.get(IAP_EMAIL_HEADER, "" ) return raw.split( ":" , 1 )[ 1 ] if ":" in raw else raw def chat (message: str , history: list , session_state: dict , request: gr.Request) -> tuple [ str , dict ]: # IAP ã§èªèšŒããããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ããã®ãŸãŸ Agent ã® user_id ãšããŠå©çšãã user_id = get_user_id(request) if not user_id: raise gr.Error( "IAPãããŠãŒã¶ãŒæ
å ±ãååŸã§ããŸããã§ããã" ) session_state[ "user_id" ] = user_id session_id = session_state.get( "session_id" ) if not session_id: session = agent.create_session(user_id=user_id) session_id = session[ "id" ] session_state[ "session_id" ] = session_id response_text = "" for event in agent.stream_query( message=message, user_id=user_id, session_id=session_id, ): if event.get( "content" ) and event[ "content" ].get( "parts" ): for part in event[ "content" ][ "parts" ]: if part.get( "text" ): response_text += part[ "text" ] yield response_text, session_state with gr.Blocks( title= "ã³ãŒããŒãšãŒãžã§ã³ã" , fill_height= True , css= """ .title-row { text-align: center; margin-bottom: 0; } .caption-row { text-align: center; margin-top: 0; color: #666; font-size: 0.9em; } .input-row { position: sticky; bottom: 0; background: var(--background-fill-primary); padding: 10px 0; } """ , ) as demo: gr.Markdown( "<h1 class='title-row'>â ã³ãŒããŒãšãŒãžã§ã³ã</h1>" "<p class='caption-row'>ã³ãŒããŒã«é¢ããããããããçãããŸã</p>" ) session_state = gr.State(value={}) chatbot = gr.Chatbot( show_label= False , scale= 1 , avatar_images=( None , "https://em-content.zobj.net/source/google/412/hot-beverage_2615.png" ), placeholder= "質åãå
¥åãããšãããã«äŒè©±ã衚瀺ãããŸã" , ) with gr.Row(elem_classes= "input-row" ): textbox = gr.Textbox( placeholder= "ã³ãŒããŒã«ã€ããŠè³ªåããŠãã ããïŒäŸ: ãšã¹ãã¬ããœãšããªããã®éãã¯ïŒïŒ" , show_label= False , container= False , scale= 7 , ) def respond (message, history, session_state, request: gr.Request): history = history + [ { "role" : "user" , "content" : message}, ] yield history, session_state, gr.update(value= "" , interactive= False ) assistant_text = "" for text, updated_state in chat(message, history, session_state, request): assistant_text = text session_state = updated_state yield ( history + [{ "role" : "assistant" , "content" : assistant_text}], session_state, gr.update(interactive= False ), ) yield ( history + [{ "role" : "assistant" , "content" : assistant_text}], session_state, gr.update(interactive= True ), ) textbox.submit( respond, inputs=[textbox, chatbot, session_state], outputs=[chatbot, session_state, textbox], ) if __name__ == "__main__" : port = int (os.environ.get( "PORT" , 8080 )) demo.launch(server_name= "0.0.0.0" , server_port=port) Dockerfile Cloud Run ã«ãããã€ããããã®ã³ã³ããã€ã¡ãŒãžãå®çŸ©ããŸããuv ã®å
¬åŒã€ã¡ãŒãžãããã€ããªãã³ããŒããäŸåããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšã¢ããªã±ãŒã·ã§ã³ã®èµ·åãè¡ããŸãã FROM python:3.14-slim COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ WORKDIR /app COPY pyproject.toml uv.lock ./ RUN uv sync --frozen --no-dev COPY app.py . EXPOSE 8080 CMD [ " uv ", " run ", " python ", " app.py " ] OAuth åæç»é¢ã®æ§æ Cloud Run ã§ IAP ãæå¹åãããšãCloud Run äžã®ãµãŒãã¹ãžã®ã¢ã¯ã»ã¹æã« Google ã¢ã«ãŠã³ãã§ã®ãã°ã€ã³ãæ±ããããããã«ãªããèš±å¯ããããŠãŒã¶ãŒã®ã¿ããã£ããããããå©çšã§ããŸãã ãããžã§ã¯ãã§ OAuth åæç»é¢ã®æ§æããŸã è¡ã£ãŠããªãå Žåã以äžã®ããã¥ã¡ã³ããåç
§ããŠå®æœããŠãã ããã åè : OAuth åæç»é¢ãèšå®ããã¹ã³ãŒããéžæãã Cloud Run ãžã®ããã〠ãµãŒãã¹ã¢ã«ãŠã³ãã®äœæ Cloud Run çšã®ã«ã¹ã¿ã ãµãŒãã¹ã¢ã«ãŠã³ããäœæããAgent Runtime ãžã®ã¢ã¯ã»ã¹ã«å¿
èŠãª Agent Platform ãŠãŒã¶ãŒ ïŒ roles/aiplatform.user ïŒããŒã«ãä»äžããŸãã # ãµãŒãã¹ã¢ã«ãŠã³ãã®äœæ $ gcloud iam service-accounts create coffee-agent-frontend \ --display-name =" Coffee Agent Frontend " # Agent Platform User ããŒã«ã®ä»äž $ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member =" serviceAccount:coffee-agent-frontend@ ${PROJECT_ID} .iam.gserviceaccount.com " \ --role =" roles/aiplatform.user " ããã〠gcloud run deploy ã³ãã³ãã§ Cloud Run ã«ãããã€ããŸãã --source ãªãã·ã§ã³ãæå®ãããšãCloud Build ã«ããã³ã³ããã€ã¡ãŒãžã®ãã«ããšãããã€ãèªåã§è¡ãããŸãã --no-allow-unauthenticated ãš --iap ãæå®ããããšã§ãIAP ã§èªèšŒããããŠãŒã¶ãŒã®ã¿ãã¢ã¯ã»ã¹ã§ããããã«ããŠããŸãã --service-account ã§å
ã»ã©äœæããã«ã¹ã¿ã ãµãŒãã¹ã¢ã«ãŠã³ããæå®ããŸãããŸãã --set-env-vars ã§ãããã€æžã¿ã® Agent Runtime ã®ãªãœãŒã¹åãç°å¢å€æ°ãšããŠæž¡ããŸãã $ gcloud run deploy coffee-agent-frontend \ --source . \ --region asia-northeast1 \ --set-env-vars " GOOGLE_CLOUD_PROJECT= $PROJECT_ID ,GOOGLE_CLOUD_LOCATION=asia-northeast1,AGENT_ENGINE_ID= $RESOURCE_NAME " \ --service-account coffee-agent-frontend@ ${PROJECT_ID} .iam.gserviceaccount.com \ --cpu 1 \ --memory 1Gi \ --no-allow-unauthenticated \ --iap åäœç¢ºèª ãããã€ãå®äºããããCloud Run ãµãŒãã¹ã® URL ã«ãã©ãŠã¶ã§ã¢ã¯ã»ã¹ããŸãã # ãããã€åŸã«åºåããããµãŒãã¹ URL Service URL: https://lawapi-frontend- < ãããžã§ã¯ãçªå· > .asia-northeast1.run.app IAP ãæå¹åãããŠãããããGoogle ã¢ã«ãŠã³ãã§ã®ãã°ã€ã³ãæ±ããããŸãã IAP ã§ä¿è·ããããŠã§ãã¢ã㪠ãŠãŒã¶ãŒ ïŒ roles/iap.httpsResourceAccessor ïŒããŒã«ãä»äžããããŠãŒã¶ãŒã§ãã°ã€ã³ããŸãã Google ã¢ã«ãŠã³ãã§ãã°ã€ã³ãã ãŸãæåã®ã»ãã·ã§ã³ã§ã¯ãæ®æ®µé£²ãã³ãŒããŒã«ã€ããŠã®æ
å ±ïŒäŸ: ãç§ã¯äžæµ
ç
ãã®ã³ã¹ã¿ãªã«ããã飲ã¿ãŸããããããã®æœåºæ¹æ³ãæããŠãã ãããïŒããšãŒãžã§ã³ãã«äŒããŸãã æåã®ã»ãã·ã§ã³ã§æ®æ®µé£²ãã§ããã³ãŒããŒè±ã«ã€ããŠã®æ
å ±ããšãŒãžã§ã³ãã«äŒãã Memory Bank ã®äžèº«ã確èªãããšãIAP ã§ãã°ã€ã³ãããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ã user_id ãšããŠããç§ã¯äžæµ
ç
ãã®ã³ã¹ã¿ãªã«ããã飲ã¿ãŸããããšããæ
å ±ãä¿æããèšæ¶ãäœæãããŠããããšãããããŸãã IAP ã§ãã°ã€ã³ãããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ã user_id ãšããŠèšæ¶ãäœæããã å床ãå¥ãã©ãŠã¶ããåããŠãŒã¶ãŒã䜿çšããŠãã£ãããããã«ãã°ã€ã³ããŠããç§ã®å¥œã¿ã«åãã³ãŒããŒè±ãæ¢ããŠãã ããããšäŒããŠã¿ãŸããååäŒããã³ãŒããŒã®å¥œã¿ã Memory Bank ã«èšæ¶ãããŠããããããã®æ
å ±ãå
ã«ããåçãè¿ã£ãŠããŸãã ãŠãŒã¶ãŒããšã«ä¿åããã奜ã¿ã«é¢ããæ
å ±ãå¥ã®ã»ãã·ã§ã³ã«åŒãç¶ãããŠãã Memory Bank ã®ã«ã¹ã¿ãã€ãº ã«ã¹ã¿ãã€ãºã®æŠèŠ Memory Bank ã¯ããã©ã«ãèšå®ã§ããŠãŒã¶ãŒã®å奜ãªã©ãèªåçã«æœåºããŠé·æèšæ¶ãšããŠä¿åããŠãããŸãããå®éã«ãšãŒãžã§ã³ããšããåããç¹°ãè¿ããŠã¿ããšãæãããã«æœåºãããªãå ŽåããããŸãã Memory Bank ã§ã¯ãã«ã¹ã¿ãã€ãºèšå®ãé©çšããããšã§ãæœåºããæ
å ±ã®çš®é¡ãæåããŠãŒã¹ã±ãŒã¹ã«åãããŠèª¿æŽããããšãã§ããŸãã Memory Bank ã§ã¯äž»ã«ä»¥äžã®é
ç®ãã«ã¹ã¿ãã€ãºã§ããŸãã é
ç® èª¬æ ããã㯠Memory Bank ãä¿åãã¹ããšå€æããæ
å ±ã®çš®é¡ãå®çŸ©ããŸããGoogle Cloud ãæäŸãã managed ãããã¯ ïŒ USER_PERSONAL_INFO ã USER_PREFERENCES ã KEY_CONVERSATION_DETAILS ã EXPLICIT_INSTRUCTIONS ïŒãšãã©ãã«ãšæœåºæç€ºãèªåã§å®çŸ©ã§ãã custom ããã㯠ã®2çš®é¡ããããŸãã çæã¢ãã« èšæ¶ã®çæã«äœ¿çšãã LLM ãæå®ã§ããŸãïŒããã©ã«ã㯠gemini-2.5-flash ïŒã åã蟌ã¿ã¢ãã« èšæ¶ã®æ€çŽ¢ãçµ±åã®å€å®ã«äœ¿çšããåã蟌ã¿ã¢ãã«ïŒembedding modelïŒãæå®ã§ããŸãïŒããã©ã«ã㯠text-embedding-005 ïŒãæ¥æ¬èªãªã©è±èªä»¥å€ã®äŒè©±ãæ±ãå Žåã¯ã gemini-embedding-001 ã text-multilingual-embedding-002 ãšãã£ãå€èšèªå¯Ÿå¿ã¢ãã«ãæå®ããããšã§æ€çŽ¢å質ãåäžã§ããŸãã æå¹æéïŒTTLïŒ çæã»æŽæ°ãããèšæ¶ã®æå¹æéãèªåèšå®ããã«ãŒã«ãå®çŸ©ã§ããŸãã Few-shot Examples æœåºããŠã»ããèšæ¶ã®äŸãããã€ãäžããããšã§ãMemory Bank ã®æœåºæåã調æŽã§ããŸãã ã«ã¹ã¿ãã€ãºé
ç®ã®è©³çްã«ã€ããŠã¯ã以äžã®ããã¥ã¡ã³ããåç
§ããŠãã ããã åè : ã¡ã¢ãªãã³ã¯ çšã« Agent Platform ã€ã³ã¹ã¿ã³ã¹ãæ§æãã ã«ã¹ã¿ãã€ãºçšã¹ã¯ãªããïŒupdate.pyïŒã®äœæ adk ã³ãã³ããã㯠Memory Bank ã®ã«ã¹ã¿ãã€ãºãçŽæ¥é©çšããããšã¯ã§ããªããããAgent Platform SDK ã䜿çšããã¹ã¯ãªããã§ããããã€æžã¿ã® Agent Runtime ã€ã³ã¹ã¿ã³ã¹ãæŽæ°ããŸãã ããã§ã¯ã³ãŒããŒãšãŒãžã§ã³ãã®ãŠãŒã¹ã±ãŒã¹ã«åãããŠãã³ãŒããŒã«é¢ããæ
å ±ãéç¹çã«æœåºããããã® custom ãããã¯ãå®çŸ©ããŸããå
·äœçã«ã¯ã以äžã®5ã€ã®ãããã¯ã Memory Bank ã«ç»é²ããŸãã ãããã¯ çš®é¡ æœåºå¯Ÿè±¡ USER_PREFERENCES managed ãŠãŒã¶ãŒã®äžè¬çãªå奜 coffee_taste_preferences custom 奜ã / èŠæãªå³ããã®åŸåïŒé
žå³ã»èŠå³ã»ãã¬ãŒããŒããŒãã»çç
床åããªã©ïŒ brewing_methods custom æ®æ®µäœ¿çšããŠããæœåºæ¹æ³ãšåšå
· favorite_beans_and_origins custom 奜ã¿ã®è±ã®ç£å°ã»åçš®ã»éæã»ããŒã¹ã¿ãŒ coffee_habits_and_restrictions custom 飲çšç¿æ
£ãã«ãã§ã€ã³å¶éãªã©ã®å¶çŽ ãŸããæ¥æ¬èªã§ã®äŒè©±ã«ãããæ€çŽ¢ã®å質ãé«ããããã similarity_search_config ã§å€èšèªå¯Ÿå¿ã®åã蟌ã¿ã¢ãã« gemini-embedding-001 ãæå®ããŸãã ã¹ã¯ãªããã®å
容ã¯ä»¥äžã®ããã«ãªããŸãã client.agent_engines.update() ã« context_spec.memory_bank_config.customization_configs ãæž¡ãããšã§ããããã€æžã¿ã® Agent Runtime ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠã«ã¹ã¿ãã€ãºèšå®ã®ã¿ãåæ ã§ããŸãã import os import vertexai from vertexai.types import ( MemoryBankCustomizationConfig as CustomizationConfig, MemoryBankCustomizationConfigMemoryTopic as MemoryTopic, MemoryBankCustomizationConfigMemoryTopicCustomMemoryTopic as CustomMemoryTopic, MemoryBankCustomizationConfigMemoryTopicManagedMemoryTopic as ManagedMemoryTopic, ManagedTopicEnum, ) client = vertexai.Client( project=os.getenv( "PROJECT_ID" ), location=os.getenv( "LOCATION" , "asia-northeast1" ), ) # Memory Bank ã«ä¿åããèšæ¶ã®ãããã¯å®çŸ© memory_topics = [ # ãŠãŒã¶ãŒã®å¥œã¿ïŒmanaged ãããã¯ïŒ MemoryTopic( managed_memory_topic=ManagedMemoryTopic( managed_topic_enum=ManagedTopicEnum.USER_PREFERENCES ) ), # å³ããã®å¥œã¿ MemoryTopic( custom_memory_topic=CustomMemoryTopic( label= "coffee_taste_preferences" , description=( "ãŠãŒã¶ãŒã奜ã / èŠæãªã³ãŒããŒã®å³ããã®åŸåã" "é
žå³ã»èŠå³ã»çã¿ã»ããã£æããã¬ãŒããŒããŒãïŒãã«ãŒãã£ã" "ãããã£ããã§ã³ã¬ãŒããªã©ïŒãçç
床åãïŒæµ
ç
ã / äžç
ã / æ·±ç
ãïŒã" ), ) ), # æœåºæ¹æ³ã»åšå
· MemoryTopic( custom_memory_topic=CustomMemoryTopic( label= "brewing_methods" , description=( "ãŠãŒã¶ãŒãæ®æ®µäœ¿ã£ãŠããããŸãã¯èå³ã®ããã³ãŒããŒã®æœåºæ¹æ³ãšåšå
·ã" "ãã³ãããªããããšã¹ãã¬ããœããã¬ã³ããã¬ã¹ããšã¢ããã¬ã¹ããµã€ãã©ã³ãªã©ã" "ããã³äœ¿çšããŠããã°ã©ã€ã³ããŒãããªãããŒãªã©ã®åšå
·æ
å ±ã" ), ) ), # 奜ã¿ã®è±ã»ç£å° MemoryTopic( custom_memory_topic=CustomMemoryTopic( label= "favorite_beans_and_origins" , description=( "ãŠãŒã¶ãŒã奜ã / éå»ã«é£²ãã ã³ãŒããŒè±ã®ç£å°ã»åçš®ã»éæã»ããŒã¹ã¿ãŒã" "äŸ: ãšããªã㢠ã€ã«ã¬ãã§ãã§ãã²ã€ã·ã£ããã«ãŒããŠã³ãã³ãç¹å®ã®ããŒã¹ã¿ãŒåãªã©ã" ), ) ), # 飲çšç¿æ
£ã»ã«ãã§ã€ã³å¶é MemoryTopic( custom_memory_topic=CustomMemoryTopic( label= "coffee_habits_and_restrictions" , description=( "ãŠãŒã¶ãŒã®ã³ãŒããŒã®é£²çšç¿æ
£ïŒ1æ¥ã®æ¯æ°ã飲ãæé垯ïŒã" "ã«ãã§ã€ã³å¶éã®æç¡ããã«ãã§å¿åã乳補åã¢ã¬ã«ã®ãŒã代æ¿ãã«ã¯ã®å¥œã¿ãªã©ã" ), ) ), ] customization_config = CustomizationConfig(memory_topics=memory_topics) # é¡äŒŒæ§æ€çŽ¢ã«äœ¿çšããåã蟌ã¿ã¢ãã«ïŒå€èšèªå¯Ÿå¿ã® gemini-embedding-001 ãæå®ïŒ project = os.getenv( "PROJECT_ID" ) location = os.getenv( "LOCATION" , "asia-northeast1" ) embedding_model = ( f "projects/{project}/locations/{location}/publishers/google/models/gemini-embedding-001" ) # æ¢åã® Agent Runtime ã Memory Bank ã«ã¹ã¿ãã€ãºä»ãã§æŽæ° resource_name = os.environ[ "RESOURCE_NAME" ] agent_engine = client.agent_engines.update( name=resource_name, config={ "context_spec" : { "memory_bank_config" : { "customization_configs" : [customization_config], "similarity_search_config" : { "embedding_model" : embedding_model, }, }, }, }, ) print ( "Memory Bank customization applied." ) print (f "Resource Name: {agent_engine.api_resource.name}" ) ã«ã¹ã¿ãã€ãºã®é©çš ã¹ã¯ãªãããå®è¡ããéã¯ããããã€æžã¿ã® Agent Runtime ã®ãªãœãŒã¹åïŒ projects/<ãããžã§ã¯ãID>/locations/<ãã±ãŒã·ã§ã³>/reasoningEngines/<ãšãŒãžã§ã³ãID> ïŒãç°å¢å€æ° RESOURCE_NAME ã«ã»ããããŠãããŸãã # ç°å¢å€æ°ã®ã»ãã $ export PROJECT_ID = < ãããžã§ã¯ãID > $ export LOCATION =asia-northeast1 $ export RESOURCE_NAME = < ãšãŒãžã§ã³ãã®ãªãœãŒã¹å > # ã«ã¹ã¿ãã€ãºã®é©çš $ uv run python update.py ã¹ã¯ãªããã®å®è¡ãæåãããšãAgent Runtime ã€ã³ã¹ã¿ã³ã¹ã« Memory Bank ã®ã«ã¹ã¿ãã€ãºèšå®ãåæ ãããŸãã ã³ã³ãœãŒã«ããã¯ãé¡äŒŒæ§æ€çŽ¢ã«äœ¿çšããåã蟌ã¿ã¢ãã«ã gemini-embedding-001 ã«æŽæ°ãããŠããããšã確èªã§ããŸãã é¡äŒŒæ§æ€çŽ¢ã«äœ¿çšããã¢ãã«ã倿ŽãããŠãã ã«ã¹ã¿ãã€ãºåŸã®åäœç¢ºèª Cloud Run ã«ãããã€ãããã£ãããããã«ãã°ã€ã³ãããç§ã¯é
žå³ãçŸå³ããã³ãŒããŒã奜ãã§ãã³ã¹ã¿ãªã«ãããããã±ãã¢ããšããªãã¢ãç¹ã«å¥œã¿ã§ãããã³ãããªããã§1æ¥ã«4æ¯ã»ã©é£²ã¿ãŸãã奜ã¿ã«è¿ãããããã®è±ãæããŠãã ãããã®ãããªå
容ã§ã¡ãã»ãŒãžãéä¿¡ããŠã¿ãŸãã Memory Bank ã確èªãããšãèšå®ãããããã¯ããšã«èšæ¶ãäœæãããŠããããšãããããŸãã èšå®ãããããã¯ããšã®èšæ¶ã Memory Bank ã«èšé²ããã äœã
æš é§¿å€ª (èšäºäžèЧ) G-gen æå端ãåæµ·éåšäœã®ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éšãšã³ãžã㢠2022幎6æã« G-gen ã«ãžã§ã€ã³ãGoogle Cloud Partner Top Engineer ã«éžåºïŒ2024 / 2025 Fellow / 2026ïŒã奜ã㪠Google Cloud ãããã¯ã㯠Cloud Runã è¶£å³ã¯ã³ãŒããŒãå°èª¬ïŒSFããã¹ããªïŒãã«ã©ãªã±ãªã©ã Follow @sasashun0805