ServiceNow / TapeAgents

TapeAgents is a framework that facilitates all stages of the LLM Agent development lifecycle
https://www.servicenow.com/research/TapeAgentsFramework.pdf
Apache License 2.0
124 stars 11 forks source link
agentic agents ai-agents finetuning llm-agent multi-agent multi-agent-simulation prompt-tuning
# TapeAgents ![Build Status](https://github.com/ServiceNow/TapeAgents/actions/workflows/build.yml/badge.svg) ![Tests Status](https://github.com/ServiceNow/TapeAgents/actions/workflows/python-tests.yml/badge.svg) ![Supported Python Versions](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)

TapeAgents is a framework that leverages a structured, replayable log (Tape) of the agent session to facilitate all stages of the LLM Agent development lifecycle. In TapeAgents, the agent reasons by processing the tape and the LLM output to produce new thoughts, actions, control flow steps and append them to the tape. The environment then reacts to the agent’s actions by likewise appending observation steps to the tape.

image

Key features:

The Tape-centric design of TapeAgents will help you at all stages of your project:

Get Started

We highly recommend starting with the introductory Jupyter notebook. The notebook will introduce you to all the core concepts of framework.

Installation

  1. Clone the repository:

    git clone https://github.com/ServiceNow/TapeAgents.git
    cd TapeAgents
  2. Create conda environment and install the package in editable mode:

    make setup

Examples

To run the example, first activate the tapeagents environment that was created during the setup process:

conda activate tapeagents

The simplest agent just to show the basic structure of the agent:

from tapeagents.agent import Agent, Node
from tapeagents.core import Prompt
from tapeagents.dialog_tape import AssistantStep, UserStep, DialogTape
from tapeagents.llms import LLMStream, LiteLLM
from tapeagents.prompting import tape_to_messages

llm = LiteLLM(model_name="gpt-4o-mini")

class MainNode(Node):
    def make_prompt(self, agent: Agent, tape: DialogTape) -> Prompt:
        # Render the whole tape into the prompt, each step is converted to message
        return Prompt(messages=tape_to_messages(tape))

    def generate_steps(self, agent: Agent, tape: DialogTape, llm_stream: LLMStream):
        # Generate single tape step from the LLM output messages stream.
        yield AssistantStep(content=llm_stream.get_text())

agent = Agent[DialogTape].create(llm, nodes=[MainNode()])
start_tape = DialogTape(steps=[UserStep(content="Tell me about Montreal in 3 sentences")])
final_tape = agent.run(start_tape).get_final_tape()  # agent will start executing the first node
print(f"Final tape: {final_tape.model_dump_json(indent=2)}")

The examples/ directory contains examples of how to use the TapeAgents framework for building, debugging, serving and improving agents. Each example is a self-contained Python script (or module) that demonstrates how to use the framework to build an agent for a specific task.

Other notable examples that demonstrate the main aspects of the framework:

Learn more

See our technical report on TapeAgents.

Contacts

Feel free to reach out to the team:

Acknowledgements

We acknowledge the inspiration we took from prior frameworks, in particular LangGraph, AutoGen, AIWaves Agents and DSPy.