This project has been archived by its maintainers, and is no longer receiving any updates.
Install
uv add grafo-ai-tools
WHAT
A set of tools for easily interacting with LLMs.
WHY
Building AI-driven software leans upon a number of utilities, such as prompt building and LLM calling via HTTP requests. Additionally, writing agents and workflows can prove particularly challenging using conventional code structures.
HOW
This simple library offers a set of predefined functions for:
- Easy prompting - you need only provide a path
- Calling LLMs - instructor takes care of that for us
- Modifying response models - we use Pydantic (duh)
Additionally, we provide grafo out of the box for convenient workflow building.
About Grafo
Grafo (see Recommended Docs below) is a library for building executable DAGs where each node contains a coroutine. Since the DAG abstraction fits particularly well into AI-driven building, we have provided the BaseWorkflow class with the following methods:
taskfor LLM callingredirectto help you manage redirections in yourgrafoworkflows
Examples
Simple text:
from ait import AIT
ait = AIT("gpt-5")
path = "./prompt.md"
response = ait.chat(path)
print(response.completion)
print(response.content)
Structured response:
from ait import AIT
from pydantic import BaseModel
class Purchase(BaseModel):
product: str
quantity: int
ait = AIT("gpt-5")
path = "./prompt.md" # PROMPT: {{ message }}
message = "I want to buy 5 apples"
response = ait.asend(response_model=Fruit, path=path, message=message)
Structured response with model type injection:
from ait import AIT
from pydantic import BaseModel
class Purchase(BaseModel):
product: str
quantity: int
ait = AIT("gpt-5")
path = "./prompt.md" # PROMPT: {{ message }}
message = "I want to buy 5 apples"
available_fruits = ["apple", "banana", "orange"]
FruitModel = ait.inject_types(Purchase, [
("product", Literal[tuple(available_fruits)])
])
response = ait.asend(response_model=Purchase, path=path, message=message)
Simple workflow:
from ait import AIT, BaseWorkflow, Node
from pydantic import BaseModel
class Purchase(BaseModel):
product: str
quantity: int
class Eval(BaseModel):
is_valid: bool
reasoning: str
humanized_failure_reason: str | None
ait = AIT("gpt-5")
prompts_path = "./"
message = "I want to buy 5 apples"
available_fruits = ["apple", "banana", "orange"]
FruitModel = ait.inject_types(Purchase, [
("product", Literal[tuple(available_fruits)])
])
class PurchaseWorkflow(BaseWorkflow):
def __init__(...):
...
async def run(self, message) -> Purchase:
purchase_node = Node[FruitModel](
uuid="fruit purchase node"
coroutine=self.task
kwargs=dict(
path=f"{prompts_path}/purchase.md"
response_model=FruitModel
message=message
)
)
validation_node = Node[Eval](
uuid="purchase eval node"
coroutine=self.task
kwargs=dict(
path=f"{prompts_path}/eval.md"
response_model=Eval
message=message
purchase=lambda: purchase_node.output
)
)
eval_node.on_after_run = (
self.redirect,
dict(
source_node=purchase_node
validation_node=validation_node
)
)
await purchase_node.connect(validation_node)
executor = TreeExecutor(uuid="Purchase Workflow", roots=[purchase_node])
await executor.run()
if not purchase_node.output or not validation_node.output.is_valid:
raise ValueError("Purchase failed.")
return purchase_node.output
Recommended Docs
instructorhttps://python.useinstructor.com/jinja2https://jinja.palletsprojects.com/en/stable/pydantichttps://docs.pydantic.dev/latest/grafohttps://github.com/paulomtts/grafo
Metadata
Release files for grafo-ai-tools 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| grafo_ai_tools-0.1.7.tar.gz | 12.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| grafo_ai_tools-0.1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.5 kB
Release files / grafo_ai_tools-0.1.7.tar.gz
| Download URL | grafo_ai_tools-0.1.7.tar.gz |
|---|---|
| Size | 12.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
420bdaeea281eda5e626521b4990c0f130cc8f12700c6504b87a125a01945d46
|
|
BLAKE2b-256 checksum How to use checksums |
123e1eaf8111a3ca79785e7e369287340ecea0eea533519010030af84964d14b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Release files / grafo_ai_tools-0.1.7-py3-none-any.whl
| Download URL | grafo_ai_tools-0.1.7-py3-none-any.whl |
|---|---|
| Size | 14.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f209489d7927ff5be35ba91c361a4ae2b74935af31289bd6c394e3543f31d7e2
|
|
BLAKE2b-256 checksum How to use checksums |
3e7f1ae7bc2e67131062e8b3acfed6e68538d6cc0605b1e478594b25ce410e54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Security for grafo-ai-tools 0.1.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.