Zeno Things tools: list/add/complete @tool wrappers backed by things-sdk.
Project description
zeno-tools-things
Things 3 / Things Cloud @tool wrappers for the Zeno AI assistant
framework, backed by things-sdk.
Three agent-callable tools:
things_list(when="today"|"inbox"|"anytime"|"someday")— read tasksthings_add(title, notes=None, when="inbox", deadline=None)— create a taskthings_complete(uuid)— mark a task complete
A ThingsAccount owns one local SQLite mirror plus one Things Cloud HTTP
client, with a TTL guard so a single conversational turn doesn't double-pull
from the cloud.
Install
uv add 'zeno-framework[things]'
Set credentials in the environment:
export THINGS_EMAIL="you@example.com"
export THINGS_PASSWORD="..."
Wiring
import asyncio
import contextlib
from pathlib import Path
from zeno.agent import Agent
from zeno.app import ZenoApp
from zeno.channels.cli import CliChannel
from zeno.memory import ThreeLayer
from zeno.memory.sqlite.conversation_store import SqliteConversationStore
from zeno.memory.sqlite.session_store import SqliteSessionStore
from zeno.memory.sqlite.user_memory_store import SqliteUserMemoryStore
from zeno.providers.claude_sdk import ClaudeSDKProvider
from zeno.tools_things import (
configure_things,
things_add,
things_complete,
things_list,
)
async def amain() -> None:
data = Path.home() / ".zeno"
data.mkdir(parents=True, exist_ok=True)
# Reads THINGS_EMAIL / THINGS_PASSWORD from the environment.
account = configure_things(
db_path=str(data / "things.db"),
sync_ttl_seconds=60,
)
agent = Agent(
name="root",
instructions="You manage the user's Things tasks.",
tools=[things_list, things_add, things_complete],
)
app = ZenoApp(
agent=agent,
memory=ThreeLayer(
session=SqliteSessionStore(data / "sessions.db"),
user_memory=SqliteUserMemoryStore(data / "user_memory.db"),
knowledge=..., # plug in zeno-chroma or zeno-qdrant
conversation=SqliteConversationStore(data / "conversations.db"),
),
channels=[CliChannel()],
provider=ClaudeSDKProvider(),
)
try:
await app.run()
finally:
with contextlib.suppress(Exception):
await account.stop()
asyncio.run(amain())
configure_things(...) installs a process-wide handle. Apps that prefer
per-Ctx wiring can set ctx.state["things"] = ThingsAccount(...)
directly — the tools resolve ctx.state first and fall back to the global.
Grouping the tools as a SubAgent
If your root agent has many responsibilities, isolate Things behind a specialist:
from zeno.agent import Agent, SubAgent
things_agent = SubAgent(
name="things",
instructions=(
"You manage the user's Things tasks. "
"Use `things_list` to read, `things_add` to create, "
"and `things_complete` to mark a task done."
),
tools=[things_list, things_add, things_complete],
)
root = Agent(
name="root",
instructions="Delegate todo-related questions to the `things` sub-agent.",
sub_agents=[things_agent],
)
Sub-agent dispatch works on ClaudeSDKProvider (Claude Agent SDK's Task
tool). OpenAIProvider does not support sub-agents — ZenoApp.start()
raises ProviderCapabilityError if you mix them.
Sync model
- Reads:
things_listcallspull_synconly if the last successful pull was outside the configured TTL (default 60 s). Back-to-back calls within the window reuse the cached SQLite state. - Writes:
things_addandthings_completewrite locally then callpush_syncimmediately so changes show up on every Things device right away.
License
MIT — see LICENSE.
Part of the Zeno framework.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zeno_tools_things-1.0.2.tar.gz.
File metadata
- Download URL: zeno_tools_things-1.0.2.tar.gz
- Upload date:
- Size: 12.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
806f74b2f40bc0f0df8cf4f2b8230236ef400549567cf013432ab454528ee025
|
|
| MD5 |
95852c584d20f462ef666903b7eb8159
|
|
| BLAKE2b-256 |
266ca7795db8815aca4f998d49672b80c3c40606da06f9658b61bf2c6a8c2e43
|
Provenance
The following attestation bundles were made for zeno_tools_things-1.0.2.tar.gz:
Publisher:
publish.yml on nkootstra/zeno
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zeno_tools_things-1.0.2.tar.gz -
Subject digest:
806f74b2f40bc0f0df8cf4f2b8230236ef400549567cf013432ab454528ee025 - Sigstore transparency entry: 1397578979
- Sigstore integration time:
-
Permalink:
nkootstra/zeno@72ad0b64cf2f613e651164797f20ce1efb2a7c36 -
Branch / Tag:
refs/tags/v1.0.2 - Owner: https://github.com/nkootstra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@72ad0b64cf2f613e651164797f20ce1efb2a7c36 -
Trigger Event:
push
-
Statement type:
File details
Details for the file zeno_tools_things-1.0.2-py3-none-any.whl.
File metadata
- Download URL: zeno_tools_things-1.0.2-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ce3caebfa284695a84d52ab5ed64ae19d243afe20477b2f84b9a68b764e609c
|
|
| MD5 |
14a15252b867a8f6874cbdf467c87122
|
|
| BLAKE2b-256 |
c253ef2a9e7b2c45c3b0c90c81ff57b98f6dc0c2cb29479e113c4121c362b2ff
|
Provenance
The following attestation bundles were made for zeno_tools_things-1.0.2-py3-none-any.whl:
Publisher:
publish.yml on nkootstra/zeno
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zeno_tools_things-1.0.2-py3-none-any.whl -
Subject digest:
7ce3caebfa284695a84d52ab5ed64ae19d243afe20477b2f84b9a68b764e609c - Sigstore transparency entry: 1397578991
- Sigstore integration time:
-
Permalink:
nkootstra/zeno@72ad0b64cf2f613e651164797f20ce1efb2a7c36 -
Branch / Tag:
refs/tags/v1.0.2 - Owner: https://github.com/nkootstra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@72ad0b64cf2f613e651164797f20ce1efb2a7c36 -
Trigger Event:
push
-
Statement type: