LeRobot documentation

Ferramentas

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.6.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Ferramentas

LeRobot suporta chamadas de ferramentas em políticas — mensagens de assistente podem emitir invocações estruturadas como say(text="OK, starting now") que o runtime despacha para uma implementação real (TTS, controlador, logger, …).

Esta página aborda:

  1. Onde o catálogo de ferramentas fica.
  2. Como o pipeline de anotação produz átomos de chamada de ferramenta.
  3. Como adicionar sua própria ferramenta.

Onde as ferramentas são declaradas

Duas camadas.

O catálogo — uma lista de esquemas de funções no estilo OpenAI — está em meta/info.json["tools"] em cada conjunto de dados. Exemplo:

{
  "features": { "...": "..." },
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "say",
        "description": "Speak a short utterance to the user via the TTS executor.",
        "parameters": {
          "type": "object",
          "properties": {
            "text": {
              "type": "string",
              "description": "The verbatim text to speak."
            }
          },
          "required": ["text"]
        }
      }
    }
  ]
}

Leia-o por meio do acessor de metadados do conjunto de dados:

from lerobot.datasets.dataset_metadata import LeRobotDatasetMetadata

meta = LeRobotDatasetMetadata(repo_id="pepijn/super_poulain_final_annotations")
tools = meta.tools     # list[dict] — OpenAI tool schemas

Se o info.json do conjunto de dados não declarar nenhuma ferramenta, meta.tools retorna DEFAULT_TOOLS de lerobot.datasets.language — atualmente uma lista com uma única entrada contendo o esquema canônico say. Assim, conjuntos de dados sem anotações e consumidores de modelos de chat continuam funcionando sem nenhuma configuração:

prompt_str = tokenizer.apply_chat_template(
    sample["messages"],
    tools=meta.tools,                 # works either way
    add_generation_prompt=False,
    tokenize=False,
)

As implementações — Python executável — ficarão em src/lerobot/tools/, um arquivo por ferramenta. O despachador de runtime e a implementação canônica de say (que encapsula o pocket-tts da Kyutai) não fazem parte da camada de catálogo descrita aqui; hoje, esta camada fornece apenas o armazenamento do esquema e a constante de fallback DEFAULT_TOOLS.

Invocações de ferramentas por linha

O catálogo acima descreve o que pode ser chamado. A chamada real — o nome da função mais os valores dos argumentos — é armazenada por linha, nos átomos de assistente em language_events:

{
  "role": "assistant",
  "content": null,
  "style": null,
  "timestamp": 12.4,
  "camera": null,
  "tool_calls": [
    { "type": "function",
      "function": { "name": "say", "arguments": { "text": "On it." } } }
  ]
}

As receitas inserem esses dados nas mensagens renderizadas por meio de tool_calls_from:

user_interjection_response:
  bindings:
    speech: "emitted_at(t, role=assistant, tool_name=say)"
  messages:
    - { role: user, content: "${task}", stream: high_level }
    - {
        role: assistant,
        content: "${current_plan}",
        stream: high_level,
        target: true,
        tool_calls_from: speech,
      }

O alvo de treinamento do modelo é um turno do assistente que carrega tanto o texto do plano quanto a chamada da ferramenta say. Na inferência, o tempo de execução analisa o texto gerado de volta em tool_calls estruturados e despacha para a implementação correspondente.

Como adicionar sua própria ferramenta

Observação: As etapas 2 e 3 abaixo descrevem a camada de tempo de execução (src/lerobot/tools/, o protocolo Tool, TOOL_REGISTRY, get_tools(meta)), que não faz parte da camada de catálogo distribuída hoje — esses módulos ainda não existem na árvore. A etapa 1, por si só, é suficiente para tornar a ferramenta visível para o modelo de chat via meta.tools, permitindo que o modelo aprenda a gerar a chamada; a execução da chamada na inferência requer a camada de tempo de execução.

Três etapas. Exemplo concreto: uma ferramenta record_observation que a política pode chamar para capturar uma observação extra fora do loop de controle regular.

Etapa 1 — declare o esquema

Adicione uma entrada em meta/info.json["tools"] editando o arquivo diretamente no disco antes de executar o pipeline de anotação (ela será preservada).

{
  "tools": [
    { "type": "function", "function": { "name": "say", "...": "..." } },
    {
      "type": "function",
      "function": {
        "name": "record_observation",
        "description": "Capture a high-resolution still image for the user.",
        "parameters": {
          "type": "object",
          "properties": {
            "label": {
              "type": "string",
              "description": "Short label for the saved image."
            }
          },
          "required": ["label"]
        }
      }
    }
  ]
}

O esquema segue exatamente a convenção de chamada de função da OpenAI, de modo que o modelo de chat pode renderizá-lo nativamente.

Etapa 2 — implemente a chamada

Crie src/lerobot/tools/record_observation.py:

from .base import Tool
from typing import Any

RECORD_OBSERVATION_SCHEMA: dict[str, Any] = { "...": "..." }   # mirrors the JSON above


class RecordObservationTool:
    name = "record_observation"
    schema = RECORD_OBSERVATION_SCHEMA

    def __init__(self, schema: dict | None = None, output_dir: str = "."):
        self.output_dir = output_dir

    def call(self, arguments: dict) -> str:
        label = arguments["label"]
        # ... save the latest camera frame to <output_dir>/<label>.png ...
        return f"saved {label}.png"

Um arquivo por ferramenta mantém as dependências isoladas — record_observation pode puxar pillow, enquanto say puxa pocket-tts. Usuários que instalam apenas as ferramentas de que precisam evitam dependências transitivas pesadas.

Etapa 3 — registre-o

Adicione em src/lerobot/tools/registry.py:

from .record_observation import RecordObservationTool

TOOL_REGISTRY["record_observation"] = RecordObservationTool

É isso. Em tempo de execução, get_tools(meta) consulta cada schema em meta.tools, instancia a classe registrada correspondente e retorna um dicionário nome → instância para o dispatcher rotear.

Se você deseja usar uma ferramenta sem escrever uma implementação (por exemplo, apenas para o formatação do chat-template no momento do treinamento), a etapa 1 é suficiente — o modelo ainda aprende a gerar a chamada. As etapas 2 e 3 são necessárias apenas para realmente executá-la na inferência.

Update on GitHub