Skip to main content

Grasp Agents


Grasp Agents

PyPI version License: MIT PyPI downloads GitHub Stars GitHub Forks

Overview

Grasp Agents is a modular Python framework for building agentic AI pipelines and applications. It is meant to be minimalistic but functional, allowing for rapid experimentation while keeping full and granular low-level control over prompting, LLM handling, tool call loops, and inter-agent communication by avoiding excessive higher-level abstractions.

Features

  • Clean formulation of agents as generic entities over I/O schemas and shared context.
  • Transparent implementation of common agentic patterns:
    • Single-agent loops
    • Workflows (static communication topology), including loops
    • Agents-as-tools for task delegation
    • Freeform A2A communication via the in-process actor model
  • Built-in parallel processing with flexible retries and rate limiting.
  • Support for all popular API providers via LiteLLM.
  • Granular event streaming with separate events for LLM responses, thinking, and tool calls.
  • Callbacks via decorators or subclassing for straightforward customisation of agentic loops and context management.

Project Structure

  • processors/, llm_agent.py: Core processor and agent class implementations.
  • event_bus.py, runner.py: Communication management and orchestration.
  • llm_policy_executor.py: LLM actions and tool call loops.
  • prompt_builder.py: Tools for constructing prompts.
  • workflow/: Modules for defining and managing static agent workflows.
  • llm.py, cloud_llm.py: LLM integration and base LLM functionalities.
  • openai/: Modules specific to OpenAI API integration.
  • litellm/: Modules specific to LiteLLM integration.
  • memory.py, llm_agent_memory.py: Memory management.
  • run_context.py: Shared run context management.

Usage

Installation

Assuming your project manages dependencies through uv.

uv add grasp_agents
uv sync

You can of course also install using other managers like poetry or simply pip.

We recommend you use dotenv to automatically set enviroment variables from a .env file containting the necessary API keys, e.g.,

ANTHROPIC_API_KEY=your_anthropic_api_key

Try it out

Jupyter Notebook Example

Notebook Link

A Grasp-Agents Powered Web App

https://grasp.study/

Script Example

Create a script, e.g., problem_recommender.py:

import asyncio
from typing import Any

from dotenv import load_dotenv
from pydantic import BaseModel

from grasp_agents import BaseTool, LLMAgent, RunContext
from grasp_agents.litellm import LiteLLM, LiteLLMSettings
from grasp_agents.printer import print_event_stream
from grasp_agents.typing.events import ProcPacketOutEvent

load_dotenv()

sys_prompt = """
Your task is to suggest an exciting stats problem to the student. 
You should first ask the student about their education, interests, and preferences, then suggest a problem tailored specifically to them. 

# Instructions
* Use the provided tool to ask questions.
* Ask questions one by one.
* The problem must have all the necessary data.
* Use the final answer tool to provide the problem.
"""


class TeacherQuestion(BaseModel):
    question: str


StudentReply = str


ask_student_tool_description = """
"Ask the student a question and get their reply."

Args:
    question: str
        The question to ask the student.
Returns:
    reply: str
        The student's reply to the question.
"""


class AskStudentTool(BaseTool[TeacherQuestion, StudentReply, None]):
    name: str = "ask_student"
    description: str = ask_student_tool_description

    async def run(self, inp: TeacherQuestion, **kwargs: Any) -> StudentReply:
        return input(inp.question)


class Problem(BaseModel):
    problem: str


teacher = LLMAgent[None, Problem, None](
    name="teacher",
    llm=LiteLLM(
        model_name="claude-sonnet-4-5",
        llm_settings=LiteLLMSettings(reasoning_effort="low"),
    ),
    tools=[AskStudentTool()],
    final_answer_as_tool_call=True,
    sys_prompt=sys_prompt,
    stream_llm_responses=True,
)

async def main():
    ctx = RunContext[None]()
    async for event in print_event_stream(teacher.run_stream("start", ctx=ctx)):
        if isinstance(event, ProcPacketOutEvent):
            result = event.data.payloads[0]
            print(f"\n<Suggested Problem>:\n\n{result.problem}\n")

asyncio.run(main())

Run your script:

uv run problem_recommender.py

You can find more examples in src/grasp_agents/examples/notebooks/agents_demo.ipynb.

Metadata

Release files for grasp_agents_legacy 0.6.54

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for grasp_agents_legacy 0.6.54
File Size Uploaded
grasp_agents_legacy-0.6.54.tar.gz 66.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for grasp_agents_legacy 0.6.54
File Interpreter ABI Platform
grasp_agents_legacy-0.6.54-py3-none-any.whl Python 3 none any Details

Total release size: 164.8 kB

Release files / grasp_agents_legacy-0.6.54.tar.gz

Download URL grasp_agents_legacy-0.6.54.tar.gz
Size 66.9 kB
Tags Source
SHA-256 checksum
How to use checksums
fcb5cd03517e8b1126e7910a5ebb772efca86e5c840fdd8532171b4e5fe56ec3
BLAKE2b-256 checksum
How to use checksums
8fb3d287ac71857bcf4bf08fa26555209302bde80e02ca608a75fc38c50b75cf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / grasp_agents_legacy-0.6.54-py3-none-any.whl

Download URL grasp_agents_legacy-0.6.54-py3-none-any.whl
Size 97.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9ef597f97ed17566badfc10eab7b040d1b7f31bafe880a3d0477d57883b81a8a
BLAKE2b-256 checksum
How to use checksums
a02b72d2dd4cf1d4f51a5655cff6145cfa372d685593b42add556c33d052df8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.6.54 This release

2 release files

0.6.53

2 release files

0.6.52

2 release files

0.6.51

2 release files

0.6.50

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page