Google Integration

This module provides integration with Google tools, such as those used with Gemini, allowing for the use of MCP-defined tools within Google’s ecosystem.

Usage Example

 1from dotenv import load_dotenv
 2
 3load_dotenv()
 4
 5import os
 6
 7from google.adk.agents import Agent
 8from google.adk.models.lite_llm import LiteLlm
 9from google.adk.runners import Runner
10from google.adk.sessions import InMemorySessionService
11from google.genai import types
12
13from agentstr import ChatInput, NostrAgentServer, NostrMCPClient
14from agentstr.mcp.google import to_google_tools
15
16# Create Nostr MCP client
17nostr_mcp_client = NostrMCPClient(relays=os.getenv("NOSTR_RELAYS").split(","),
18                                  private_key=os.getenv("EXAMPLE_GOOGLE_AGENT_NSEC"),
19                                  mcp_pubkey=os.getenv("EXAMPLE_MCP_SERVER_PUBKEY"),
20                                  nwc_str=os.getenv("MCP_CLIENT_NWC_CONN_STR"))
21
22async def agent_server():
23    # Define tools
24    google_tools = await to_google_tools(nostr_mcp_client)
25
26    for tool in google_tools:
27        print(f'Found {tool.name}: {tool.description}')
28
29    # Define Google agent
30    agent = Agent(
31        name="google_agent",
32        model=LiteLlm(
33            model=os.getenv("LLM_MODEL_NAME"),
34            api_base=os.getenv("LLM_BASE_URL").rstrip('/v1'),
35            api_key=os.getenv("LLM_API_KEY")
36        ),
37        instruction="You are a helpful assistant.",
38        tools=google_tools,
39    )
40
41    # Session and Runner
42    session_service = InMemorySessionService()
43    runner = Runner(agent=agent, app_name='nostr_example', session_service=session_service)
44
45    # Define agent callable
46    async def agent_callable(input: ChatInput) -> str:
47        content = types.Content(role='user', parts=[types.Part(text=input.messages[-1])])
48        await session_service.create_session(app_name='nostr_example', user_id=input.thread_id, session_id=input.thread_id)
49        events_async = runner.run_async(user_id=input.thread_id,
50                                        session_id=input.thread_id,
51                                        new_message=content)
52        async for event in events_async:
53            print(f'Received event: {event}')
54            if event.is_final_response():
55                final_response = event.content.parts[0].text
56                print("Agent Response: ", final_response)
57                return final_response
58        return None
59
60    # Create Nostr Agent Server
61    server = NostrAgentServer(nostr_mcp_client=nostr_mcp_client,
62                              agent_callable=agent_callable)
63
64    # Start server
65    await server.start()
66
67
68if __name__ == "__main__":
69    import asyncio
70    asyncio.run(agent_server())