Tulipee — a small async Zulip bot playground.
Handlers include a YouTrack issue creator that listens to a specific stream/topic and creates issues using an optional LLM step to structure titles/descriptions.
Quick start
- Configure
.env(see below), then run:uv run python -m tulipee
Container
- Build locally:
docker build -t ghcr.io/<owner>/tulipee:dev . - Run:
docker run --rm -e ZULIP_URL=... -e API_KEY=... -e EMAIL=... -e YOUTRACK_URL=... -e YOUTRACK_TOKEN=... -e OPENAI_API_KEY=... ghcr.io/<owner>/tulipee:dev
CI/CD
- GitHub Actions workflow builds and pushes
ghcr.io/<owner>/tulipeeon pushes tomainand tagsv*. - No extra secrets needed; uses
GITHUB_TOKENwithpackages: write. - To pull without auth, set the GHCR package visibility to public in repo Packages settings.
Configuration (.env)
ZULIP_URL— Zulip server base URLAPI_KEY— Zulip bot API keyEMAIL— Zulip bot emailLOG_LEVEL— optional, defaultDEBUGYOUTRACK_URL— YouTrack base URL (e.g., https://youtrack.example.com)YOUTRACK_TOKEN— YouTrack permanent token (Bearer)OPENAI_API_KEY— for LLM parsing via OpenRouter/OpenAI; if not set, uses fallbackOPENAI_BASE_URL— defaulthttps://openrouter.ai/api/v1(recommended)OPENAI_MODEL— e.g.,openrouter/auto(default) or a specific model nameOPENAI_HTTP_REFERER— optional, your site URL for OpenRouter attributionOPENAI_APP_TITLE— optional, app name for OpenRouter attribution
YouTrack Create Issue handler
- Listens on Zulip stream
youtrack, topiccreate issue. - Message body is parsed into
title/descriptionvia OpenAI if configured; otherwise uses first line as title and the rest as description. - Selects the target project using the catalog defined in
tulipee/handlers/youtrack_projects.pyand LLM guidance, then replies with the issue link.
Notes
- Never commit your
.envor tokens. Use environment variables in CI. - The YouTrack handler requires valid URL, token, and a project id.