Telegramrobotar med egen värd

Note

Självvärdhjälpare för Telegram-robotar i .NET kommer snart.

Note

Självbetjäningshjälpare för Telegram-robotar är för närvarande inte tillgängliga för Go.

agent-framework-hosting-telegram konverterar Telegram Bot API-uppdateringar till Agent Framework-körningsvärden och renderar slutgiltiga eller strömmande körningar som bot-API-åtgärder. Det tillhandahåller inte någon botklient, pollningskörmiljö, webhook-router, kommandoregistrering eller distributionsramverk.

pip install --pre agent-framework agent-framework-foundry agent-framework-hosting agent-framework-hosting-telegram azure-identity

Använd valfritt Telegram-klientbibliotek som kan tillhandahålla en uppdateringspayload och utföra de åtgärder som returneras av hjälpfunktionerna. Exemplet använder aiogram, men hjälparna är inte knutna till det.

Bearbeta en uppdatering

Webhook-exemplet aiogram verifierar Telegrams hemliga header, vidarebefordrar uppdateringen och använder ett sessions-ID på botnivå för att bibehålla en agentsession för varje privat chatt eller delad gruppchatt.

async def handle_update(update: Mapping[str, Any]) -> None:
    """Process one Telegram update through the sample agent."""
    callback_query_id = telegram_callback_query_id(update)
    if callback_query_id is not None:
        await bot.answer_callback_query(callback_query_id=callback_query_id)

    chat_id = telegram_chat_id(update)
    session_id = telegram_session_id(update, bot_id=bot.id)
    if chat_id is None or session_id is None:
        return

    # Background webhook tasks may overlap. Serialize each chat so /new cannot
    # delete a session while an earlier response is still updating it.
    async with session_locks.setdefault(session_id, asyncio.Lock()):
        if (command := telegram_command(update)) is not None and await handle_command(update, command):
            return

        async def resolve_file_url(file_id: str) -> str | None:
            file = await bot.get_file(file_id)
            if file.file_path is None or (file.file_size is not None and file.file_size > MAX_MEDIA_BYTES):
                return None
            destination = BytesIO()
            await bot.download_file(file.file_path, destination=destination)
            data = destination.getvalue()
            if len(data) > MAX_MEDIA_BYTES:
                return None
            encoded = base64.b64encode(data).decode("ascii")
            return f"data:application/octet-stream;base64,{encoded}"

        try:
            run = await telegram_to_run(update, resolve_file_url=resolve_file_url, stream=True)
        except ValueError:
            LOGGER.debug("Ignoring non-actionable Telegram update", exc_info=True)
            return

        await bot.send_chat_action(chat_id=chat_id, action="typing")
        placeholder = await bot.send_message(chat_id=chat_id, text=PLACEHOLDER_TEXT)

        target = await state.get_target()
        # Reuse one AgentSession per Telegram chat. The /new command removes this
        # mapping so get_or_create_session creates a clean session next time.
        session = await state.get_or_create_session(session_id)
        stream = target.run(
            run["messages"],
            stream=True,
            session=session,
            options=run["options"],
        )
        if not isinstance(stream, ResponseStream):
            raise RuntimeError("agent did not return a response stream")

        last_edit_at = 0.0
        async for operation in telegram_from_streaming_run(
            stream,
            chat_id=chat_id,
            message_id=placeholder.message_id,
            initial_text=PLACEHOLDER_TEXT,
        ):
            if operation["method"] == "editMessageText":
                delay = EDIT_INTERVAL_SECONDS - (time.monotonic() - last_edit_at)
                if delay > 0:
                    await asyncio.sleep(delay)
                last_edit_at = time.monotonic()
            await execute_operation(operation)

        # Persist the updated AgentSession back under the stable per-chat key after
        # streaming has finalized and the history provider has recorded the turn.
        await state.set_session(session_id, session)

Information om avsökning och webhook-konfiguration, kommandohantering, princip för inkommande media, redigering av direktuppspelning och vägledning för produktionsdistribution finns i det lokala Telegram-exemplet.

Important

Verifiera Telegram webhook-leveranser innan du bearbetar uppdateringar. En webhookhemlighet autentiserar att leveransen kommer från Telegram, men den ger inte Telegram-användaren eller chatten åtkomst till applikationsdata. Behandla chatt- och användar-ID:n som obetrodda tills programmet tillämpar sin auktoriseringsprincip.

Nästa steg

Gå djupare: