Создание событийно-ориентированных AI-агентов с помощью UAgents и Google Gemini: руководство по модульной реализации на Python

В этом руководстве мы покажем, как использовать фреймворк UAgents для создания лёгкой архитектуры AI-агентов, управляемых событиями, на базе API Google Gemini.

Шаг 1: настройка вложенных циклов событий

Сначала мы применяем `nest_asyncio`, чтобы включить вложенные циклы событий, затем настраиваем ключ API Gemini и создаём экземпляр клиента GenAI.

Шаг 2: определение коммуникационных контрактов

Мы определяем наши коммуникационные контракты, модели вопроса и ответа Pydantic, а затем запускаем два UAgents: один «geminiagent», который прослушивает входящие сообщения с вопросами, вызывает модель Gemini «flash» для генерации ответов и выдаёт сообщения с ответами; и один «clientagent», который запускает запрос при запуске и обрабатывает входящий ответ.

Шаг 3: запуск агентов одновременно

Мы изучаем, как запустить этих агентов одновременно, используя утилиту Python multiprocessing, и корректно завершаем работу цикла событий после завершения обмена, иллюстрируя плавную координацию UAgents для обмена сообщениями между агентами.

«`python
import os, time, multiprocessing, asyncio
import nest_asyncio
from google import genai
from pydantic import BaseModel, Field
from uagents import Agent, Context

nest_asyncio.apply()

os.environ[«GOOGLEAPIKEY»] = «Use Your Own API Key Here»
client = genai.Client()

class Question(BaseModel):
question: str = Field(…)

class Answer(BaseModel):
answer: str = Field(…)

ai_agent = Agent(
name=»gemini_agent»,
seed=»agentseedphrase»,
port=8000,
endpoint=[«http://127.0.0.1:8000/submit»]
)

@aiagent.onevent(«startup»)
async def ai_startup(ctx: Context):
ctx.logger.info(f»{aiagent.name} listening on {aiagent.address}»)

def ask_gemini(q: str) -> str:
resp = client.models.generate_content(
model=»gemini-2.0-flash»,
contents=f»Answer the question: {q}»
)
return resp.text

@aiagent.onmessage(model=Question, replies=Answer)
async def handle_question(ctx: Context, sender: str, msg: Question):
ans = ask_gemini(msg.question)
await ctx.send(sender, Answer(answer=ans))

client_agent = Agent(
name=»client_agent»,
seed=»clientseedphrase»,
port=8001,
endpoint=[«http://127.0.0.1:8001/submit»]
)

@clientagent.onevent(«startup»)
async def askonstart(ctx: Context):
await ctx.send(ai_agent.address, Question(question=»What is the capital of France?»))

@clientagent.onmessage(model=Answer)
async def handle_answer(ctx: Context, sender: str, msg: Answer):
print(» Answer from Gemini:», msg.answer)
# Use a more graceful shutdown
asyncio.createtask(shutdownloop())

async def shutdown_loop():
await asyncio.sleep(1) # Give time for cleanup
loop = asyncio.geteventloop()
loop.stop()

def run_agent(agent):
agent.run()

if name == «main«:
p = multiprocessing.Process(target=runagent, args=(aiagent,))
p.start()
time.sleep(2)

client_agent.run()

p.join()
«`

С помощью этого руководства, сфокусированного на UAgents, мы получили чёткий план создания модульных AI-сервисов, которые взаимодействуют через чётко определённые хуки событий и схемы сообщений. Вы увидели, как UAgents упрощает управление жизненным циклом агентов, регистрацию событий запуска, обработку входящих сообщений и отправку структурированных ответов, без необходимости написания шаблонного сетевого кода.

Теперь вы можете расширить свою настройку UAgents, включив в неё более сложные рабочие процессы разговора, несколько типов сообщений и динамическое обнаружение агентов.

Источник

Оставьте комментарий