litestar-org/litestar-skills/litestar-queues
Claude Code and agent skill by litestar-org/litestar-skills
- community
- ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Checking that the SKILL.md file is still in the repository.
Auto-activate for litestar_queues, QueuePlugin, QueueConfig, WorkerConfig, QueueService, @task, QueuedBackgroundTask, QueueEventsConfig, or SQLSpecBackendConfig. Not for litestar-saq, Celery, or Dramatiq.
Install
npx vskill@latest install litestar-org/litestar-skills/litestar-queuesSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
litestar-queues
litestar-queues is the first-party Litestar worker abstraction for task registration, durable queue state, worker lifecycle, schedules, uniqueness, bounded maintenance, execution dispatch, and application-facing task events.
Keep persistence and placement separate:
- A queue backend stores task records, identities, maintenance coordination, and optional event history.
- An execution backend decides where a claimed task runs.
- Worker wakeups are delivery hints. Persisted queue records remain the source of truth.
Code Style Rules
- Use
QueuePluginto wire lifecycle, application state, DI, task discovery, schedules, workers, and CLI commands. - Put worker settings under
QueueConfig(worker=WorkerConfig(...)). - Inject
QueueServicewithNamedDependency[QueueService]; never use a module-level service from handlers. - Import public core types from
litestar_queues. Import optional backend configuration from its backend submodule (.sqlspec,.advanced_alchemy,.redis,.valkey) and execution configs fromlitestar_queuesor their respective submodules. - Keep persistent-backend arguments and metadata JSON-serializable. Pass stable object IDs instead of large payloads.
- Use PEP 604 unions (
T | None) and async I/O. Prefermsgspecfor event/client DTOs unless the project already uses Pydantic.
Quick Reference
Minimal Plugin Setup
QueueConfig() with no arguments defaults to queue_backend="ephemeral", execution_backend="local", and placement="server" — a private per-invocation SQLite database plus one CLI-owned worker process, with no broker, port, or extra dependency. Keep that shape for tests, development, and small single-process deployments only.
Process-local "memory" storage must be asked for explicitly, together with a placement that shares the process:
Storage, execution, and placement combinations that cannot work are rejected at startup with a message naming the fix, rather than failing at first claim.
Task Options, Scheduling, and Uniqueness
In addition to await queue_service.enqueue(render_report, ...) (the primary DI pattern in route handlers), decorated tasks expose await render_report.enqueue(report_id) and await render_report.using(priority=20, run_after=60).enqueue(report_id). Task.enqueue() uses the active default QueueService registered by QueuePlugin, or falls back to an inline "memory" + "immediate" service when called in unit tests with no application wired. result.record holds the QueuedTaskRecord returned at enqueue time.
When enqueueing against an external execution backend such as Cloud Tasks, catch QueueDispatchError (from litestar_queues.exceptions import QueueDispatchError) and inspect exc.committed: when True, the record (exc.task_id) is already durably committed in SQL and bounded maintenance will repair the lost delivery.
Identity precedence is strict:
- Explicit enqueue
key. - Configured task
key. unique_by="task".unique_by="arguments".- No identity.
unique_until="terminal" is the default and releases the identity after completion, failure, or cancellation. unique_until="forever" stores a permanent reservation until await queue_service.reset_task_identity(effective_key) removes it.
Do not combine a configured key with unique_by. Do not set unique_until="forever" without a configured key or unique_by. Use QueueConfig.max_argument_identity_bytes to bound canonical payloads hashed by unique_by="arguments".
Use interval or five-field cron, never both. Recurring tasks inherit configured retries on startup and succession, and persisted occurrences retain their retry budget and backoff until completion. Use task_modules=("app.domain.reports.jobs",), discover_tasks("app.domain", "jobs"), or AutowirePlugin(AutowireConfig(domain_packages=["app.domain"], integrations=["dishka", "queues"])) before string enqueueing or schedule initialization.
To mark a failure permanent and bypass retries, call non_retryable("message") or raise NonRetryableError. To cooperatively cancel execution from within a handler, call job_cancelled("message") or raise JobCancelledError. Calling await queue_service.cancel_task(task_id, include_running=True) cancels any active remote provider execution (Cloud Run Jobs or Cloud Tasks) first before writing durable cancellation state.
Dependency Injection, Error Sanitization, and Role-Aware Worker Factory
- Attempt-scoped DI (`task_dependency_provider`): Enters an
@asynccontextmanagerper attempt(task, record, context) -> AsyncIterator[Mapping[str, Any]], merges the yielded mapping into task keyword arguments, and guarantees clean exit on success, error, timeout, or cancellation. When using Dishka, reuse an active in-process request container (request_container_var.get()) when running inline or open a freshScope.REQUESTscope on the worker container. - Error sanitization & stale priority: Set
error_sanitizer=Callable[[BaseException, QueuedTaskRecord], str]to convert exceptions into persisted error strings, andstale_requeue_priority("preserve",int, orCallable[[int], int]) for stale task recovery. - Worker placement (`WorkerConfig.placement`):
"server"(default): starts one worker in the CLI server lifespan (litestar run)."asgi": starts one worker per ASGI worker in the application lifespan (e.g.,target == "local" and role == "web")."external": starts nothing automatically; managed processes runlitestar queues runorlitestar queues run-consumer(or receive push deliveries onrole == "consumer").- Role-aware factory (`create_queue_config`): Mount
EventStreamConfigonly on the"web"role (Noneon"consumer"and"cli"), and hardenCloudTasksExecutionConfigby enablingtrust_platform_auth=(role == "consumer")and attaching a deny guard whenrole != "consumer". See Backends, Worker Configuration, Events, and Maintenance for complete factory and Dishka container examples.
Backend Selection
Queue backends own persistence:
| Existing stack or need | Queue backend | Import | |
|---|---|---|---|
| Default; dev and single-invocation apps | "ephemeral" | Core package (stdlib sqlite3) | |
| Process-local tests, shared-process placement only | "memory" (InMemoryQueueBackend) | Core package (litestar_queues) | |
| SQLSpec-managed SQL persistence | SQLSpecBackendConfig(...) | litestar_queues.backends.sqlspec | |
| Advanced Alchemy / SQLAlchemy models | SQLAlchemyBackendConfig(...) | litestar_queues.backends.advanced_alchemy | |
| Existing Redis infrastructure | RedisBackendConfig(...) | litestar_queues.backends.redis | |
| Existing Valkey infrastructure | ValkeyBackendConfig(...) | litestar_queues.backends.valkey |
Execution backends decide where a claimed task runs, and never own queue state:
| Need | Execution backend | Import | |
|---|---|---|---|
| Default in-process workers | "local" | Core package | |
| Inline completion in tests/scripts | "immediate" | Core package | |
| Isolated Google Cloud Run Jobs | CloudRunExecutionConfig(...) | litestar_queues.execution.cloudrun | |
| Serverless delivery with no worker process | CloudTasksExecutionConfig(...) | litestar_queues.execution.cloudtasks | |
| Apache Kafka continuous consumer fleet | KafkaExecutionConfig(...) | litestar_queues.execution.kafka | |
| GCP Pub/Sub continuous consumer fleet | PubSubExecutionConfig(...) | litestar_queues.execution.pubsub | |
| RabbitMQ continuous consumer fleet (Python 3.11+) | RabbitMQExecutionConfig(...) | litestar_queues.execution.rabbitmq | |
| Amazon SQS continuous consumer fleet | SqsExecutionConfig(...) | litestar_queues.execution.sqs |
Match the project's existing data stack. Memory cannot coordinate separate processes and has no MemoryBackendConfig class — pass queue_backend="memory" or an InMemoryQueueBackend instance. See Execution Backends and Backends, Worker Configuration, Events, and Maintenance.
Persistent Backends & Schema
- SQLSpec (`SQLSpecBackendConfig`): When
manage_schema=True(default),QueuePluginregisters the0001_create_queue_tasksmigration revision. Whenmanage_schema=False, register"litestar_queues"inmigration_config={"include_extensions": ["events", "litestar_queues"]}and wireconfigure_queue_migration_extension(...)fromlitestar_queues.backends.sqlspec.extension.worker_wakeupsdefaults toSQLSpecWorkerWakeupConfig(notify_queueon PostgreSQL,poll_queueon DuckDB); setworker_wakeups=NonewithCloudTasksExecutionConfig. - Advanced Alchemy (`SQLAlchemyBackendConfig`): Pass
sqlalchemy_config=alchemy_configand manage schema via application Alembic migrations (QueueTaskModelMixin,QueueEventHistoryModelMixin,QueueMaintenanceModelMixin,QueueTaskReservationModelMixin). Setworker_wakeups=Trueonly on PostgreSQL. - Redis & Valkey (`RedisBackendConfig` / `ValkeyBackendConfig`): Use pub/sub wakeup hints by default with keys namespaced under
key_prefix.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/litestar-queues/SKILL.md
Popularity
- Repository stars
- 16
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Extension points
hookPre/post lifecycle hooks
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/litestar-org/litestar-skills/litestar-queues)