Tiri Agent Tiri is a local-first agent product shell built on the standalone core. It packages the runtime into a practical personal-agent experience: CLI chat, FastAPI APIs, a Next. js web shell, sandbox tools, channel integrations, local skills, and SQLite persistence. Highlights Local-first backend with durable SQLite sessions, settings, channel state, event streams, and outbox records. Runtime composition around , keeping product policy here and neutral agent mechanics in the sibling core package. CLI and web entry points
through the same configuration path. Local and Docker-backed sandbox tools for file access and shell execution. Prompt assembly from base identity, runtime environment, optional profile context, and local skill registry. Channel adapters for Telegram, Weixin/WeChat, and Feishu/Lark, including inbound listeners and proactive outbound messaging. | | | Base prompt, profile prompt, environment prompt, and skill index assembly. | | | Tool registry composition and concrete Tiri tool sets. | | | Local and Docker sandbox implementations exposed as runtime tools. | | | Provider adapters, listeners, gateway, targets, settings
, and outbox worker. | | | FastAPI app, SQLite storage, event queues, and local server runner. js web shell for Tiri-specific backend integration. | Top-level , , and are compatibility re-export modules. New implementation should live under the structured packages above. Quick Start Install the sibling runtime and this product repo into a local virtual environment: Configure a model: Run CLI chat: Start the local API and web shell: The server command starts: FastAPI at Next. | | | Optional file overriding the base system prompt
. | | | Optional local user/profile prompt file. | | | Local data directory, defaulting to when configured. | | | Collaboration mode, currently or . | CLI flags mirror the most common settings: Prompts And Skills Tiri builds the system prompt from: for the base identity, operating loop, tool rules, workspace rules, safety guidance, and voice. The runtime environment, such as , , or . If is unset, it defaults to when is configured, otherwise . Sandbox Tools Enable local workspace tools: Use Docker-backed shell execution while keeping the same mounted workspace
: The Docker backend keeps one container per Tiri session. The container name is derived from the session id, mounted workspace, and image, so resumed sessions reuse their sandbox container and later calls execute through . Sandbox tools currently include , , , and . Local Data And Channels Tiri stores local backend data in SQLite. By default, the durable database is: The database stores chat sessions, message history, event-stream records, local settings, channel settings, proactive targets, and channel outbox entries. Supported local channel providers
: Telegram long polling via the Bot API. Inbound channel events are routed through: When exposed beyond localhost, set an inbound token and send it as or : Background channel services are enabled by default and can be disabled with: Development Run Python tests: Run frontend checks: License Tiri Agent is licensed under the GNU Affero General Public License, version 3 only.
Frequently asked questions
How many stars and forks are recorded?
easylink-ai-open/tiri-agent has 711 stars and 121 forks.
What is the repository rank?
easylink-ai-open/tiri-agent is ranked 14,688.
What language and category are recorded?
easylink-ai-open/tiri-agent has 711 stars, uses TypeScript and belongs to AI Engineering.
Which repository is closest in rank?
easylink-ai-open/tiri-agent is compared with SeanJ1ang/design-judge-skills, ranked 14,671 with 712 stars.
README
Tiri Agent
Tiri is a local-first agent product shell built on the standalone
agent-runtime core. It packages the runtime into a practical personal-agent
experience: CLI chat, FastAPI APIs, a Next.js web shell, sandbox tools,
channel integrations, local skills, and SQLite persistence.
Highlights
Local-first backend with durable SQLite sessions, settings, channel state,
event streams, and outbox records.
Runtime composition around agent-runtime, keeping product policy here and
neutral agent mechanics in the sibling core package.
CLI and web entry points through the same TiriBackend configuration path.
Local and Docker-backed sandbox tools for file access and shell execution.
Prompt assembly from base identity, runtime environment, optional profile
context, and local skill registry.
Channel adapters for Telegram, Weixin/WeChat, and Feishu/Lark, including
inbound listeners and proactive outbound messaging.
Repository Map
Path
Purpose
agent/
TiriBackend, backend config, logging hooks, and collaboration modes.
prompts/
Base prompt, profile prompt, environment prompt, and skill index assembly.
tools/
Tool registry composition and concrete Tiri tool sets.
sandbox/
Local and Docker sandbox implementations exposed as runtime tools.
channels/
Provider adapters, listeners, gateway, targets, settings, and outbox worker.
server/
FastAPI app, SQLite storage, event queues, and local server runner.
cli/
Thin tiri command entrypoint.
web/
Next.js web shell for Tiri-specific backend integration.
Top-level backend.py, config.py, and collaboration.py are compatibility
re-export modules. New implementation should live under the structured
packages above.
Quick Start
Install the sibling runtime and this product repo into a local virtual
environment:
The Docker backend keeps one container per Tiri session. The container name is
derived from the session id, mounted workspace, and image, so resumed sessions
reuse their sandbox container and later run_shell calls execute through
docker exec.
Sandbox tools currently include read_file, write_file, list_files, and
run_shell.
Local Data And Channels
Tiri stores local backend data in SQLite. By default, the durable database is:
~/.tiri/tiri.db
The database stores chat sessions, message history, event-stream records, local
settings, channel settings, proactive targets, and channel outbox entries.
Supported local channel providers:
Telegram long polling via the Bot API.
Weixin polling via the ilink bot API.
Feishu/Lark websocket via lark-oapi.
Inbound channel events are routed through:
POST /api/channels/inbound
When exposed beyond localhost, set an inbound token and send it as
Authorization: Bearer ... or X-Tiri-Channel-Token:
export TIRI_CHANNEL_INBOUND_TOKEN=local-secret
Background channel services are enabled by default and can be disabled with: