Saltar al contenido
Twexapi
Español
Esc
navegarabrir⌘Jvista previa
En esta página

Google ADK

Crea agentes Gemini ADK para búsqueda de tweets, perfiles, tendencias y escrituras en X revisadas a través de TwexAPI MCP.

Crea un agente de Twitter API con Google ADK a través del servidor MCP de TwexAPI. Busca tweets, inspecciona perfiles, lee tendencias y revisa acciones de escritura. Conserva IDs de tweet, cursores y nombres de ruta como JSON durable.

¿Por qué usar Google ADK con TwexAPI?

ADK es Gemini-first. TwexAPI aparece como un conjunto de herramientas MCP remoto: explore descubre rutas, twexapi_request las ejecuta.

Tarea del agente Ruta de TwexAPI Conservar para el siguiente paso
Buscar tweets POST /twitter/advanced_search/page Consulta, IDs de tweet, autores, created_at, cursor
Inspeccionar un perfil GET /twitter/{screen_name}/about ID de usuario, nombre de usuario, biografía, cantidad de seguidores
Leer tendencias GET /twitter/global-trending/tweets País, tema, filas de tweets
Publicar o responder POST /twitter/tweets/create ID de tweet, ruta, aprobación humana, confirmación de cookie

Usa ADK cuando el runtime sea Gemini. Usa el Python SDK o Prefect para trabajos programados que no requieren modelo.

Requisitos previos

  • Python 3.10 o posterior
  • Una API key de TwexAPI
  • Una API key de Google AI
  • Una cookie de Twitter o auth_token para acciones de escritura — consulta

Las lecturas públicas de X no requieren credenciales de X Developer. Autentícate con TwexAPI.

Instalación

python -m pip install "google-adk>=1.0" python-dotenv
TWEXAPI_API_KEY=YOUR_API_KEY
GOOGLE_API_KEY=...

Conectar TwexAPI MCP

import os

from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams

twexapi_toolset = McpToolset(
    connection_params=StreamableHTTPConnectionParams(
        url="https://api.twexapi.io/mcp",
        headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
    )
)

Las solicitudes MCP no autenticadas devuelven 401. Envía x-api-key en la primera solicitud.

Ejemplo completo

import asyncio
import os
from pathlib import Path
from typing import Literal

from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.runners import InMemoryRunner
from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
from google.genai import types
from pydantic import BaseModel


class TweetRow(BaseModel):
    tweet_id: str
    text: str
    author_username: str | None = None
    created_at: str | None = None


class TweetSearchHandoff(BaseModel):
    query: str
    route_used: str
    tweets: list[TweetRow]
    has_more: bool
    next_cursor: str | None = None
    stop_reason: Literal[
        "complete",
        "requested_limit",
        "cursor_stalled",
        "page_cap",
    ]


async def main() -> None:
    load_dotenv()

    twexapi_toolset = McpToolset(
        connection_params=StreamableHTTPConnectionParams(
            url="https://api.twexapi.io/mcp",
            headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
        )
    )

    agent = LlmAgent(
        model="gemini-2.5-flash",
        name="twexapi_agent",
        instruction=(
            "Use TwexAPI for Twitter API requests. Call explore before twexapi_request. "
            "Preserve exact IDs and cursors. Never invent missing tweet fields. "
            "Ask for confirmation before read_only: false actions. "
            "Return only valid JSON for TweetSearchHandoff."
        ),
        tools=[twexapi_toolset],
    )

    runner = InMemoryRunner(agent=agent, app_name="twexapi_app")
    session = await runner.session_service.create_session(
        app_name="twexapi_app",
        user_id="user-1",
    )

    response_parts: list[str] = []
    async for event in runner.run_async(
        user_id="user-1",
        session_id=session.id,
        new_message=types.Content(
            role="user",
            parts=[
                types.Part(
                    text=(
                        "Search 25 recent tweets about Google ADK MCP. "
                        "Return query, route_used, tweet rows, has_more, "
                        "next_cursor, and stop_reason as JSON."
                    )
                )
            ],
        ),
    ):
        if event.content and event.content.parts:
            response_parts.extend(
                part.text for part in event.content.parts if part.text
            )

    handoff = TweetSearchHandoff.model_validate_json("".join(response_parts))
    Path("twexapi-adk-handoff.json").write_text(
        handoff.model_dump_json(indent=2),
        encoding="utf-8",
    )
    await twexapi_toolset.close()


asyncio.run(main())

Si el modelo envuelve el JSON en fences de Markdown, elimínalos antes de model_validate_json. Persiste el archivo fuera de la sesión ADK.

Conservar el contrato de respuesta MCP

Reutiliza la misma consulta y filtros en cada página. Trata cada cursor como opaco.

Detén la paginación cuando se alcance el total solicitado, has_more sea false, next_cursor se repita o se alcance el límite de páginas.

Mantener una entrega de agente reanudable

Páginas de tweets

Almacena tweet_id, text, author_username, created_at, has_more, next_cursor y la consulta original.

Filas de perfil

Almacena user_id, username, name, description y cantidades de seguidores.

Filas de tendencias

Almacena país, tema, etiqueta de contenido e IDs de tweet.

Acciones de escritura

Almacena ruta, texto de vista previa y aprobación. Mantén las cookies en un almacén de secretos. Consulta.

Consulta Agent MCP Handoff.

Construir manejo de errores

Estado Significado Decisión del agente
400 Ruta o parámetros inválidos Corrige la solicitud antes de reintentar
401 API key faltante o inválida Detente y reemplaza la credencial
403 Acceso denegado o créditos Pausa escrituras; verifica Get Balance
429 Límite de tasa alcanzado Espera y luego reanuda el mismo cursor
5xx Fallo temporal del servidor Aplica backoff acotado a lecturas seguras

Consulta Error Handling y Rate Limits.

Configuración multiagente

Dale herramientas de TwexAPI solo al recolector. Mantén agentes de análisis y escritura sin herramientas para que las aprobaciones de escritura sigan siendo explícitas.

researcher = LlmAgent(
    model="gemini-2.5-flash",
    name="researcher",
    instruction="Collect X/Twitter data through TwexAPI MCP and return compact JSON.",
    tools=[twexapi_toolset],
)

analyst = LlmAgent(
    model="gemini-2.5-flash",
    name="analyst",
    instruction="Analyze structured tweet rows. Do not call external tools.",
)

Headers dinámicos y filtrado de herramientas

Usa headers dinámicos cuando una app ADK sirva múltiples cuentas de TwexAPI.

def get_headers(context):
    return {"x-api-key": context.state["twexapi_api_key"]}


twexapi_toolset = McpToolset(
    connection_params=StreamableHTTPConnectionParams(
        url="https://api.twexapi.io/mcp",
    ),
    header_provider=get_headers,
)

Expone solo descubrimiento a agentes de planificación:

planning_toolset = McpToolset(
    connection_params=StreamableHTTPConnectionParams(
        url="https://api.twexapi.io/mcp",
        headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
    ),
    tool_filter=["explore"],
)

Versiones de paquetes

Paquete Rango compatible
Python >=3.10
google-adk >=1.0
pydantic >=2.7

Próximos pasos

¿Te ha resultado útil esta página?