particle-academy/teachers-aid
Teachers Aid by Particle Academy is a Laravel package that provides practical, teacher-focused tools and framework-native helpers. It’s built for quick integration, sensible defaults, and less boilerplate when adding classroom workflows to existing applications.
teachers-aid.entities and the new teachers-aid.relations are, in product terms, the permission matrix: which record types the assistant may touch and which links it may create or remove. This is a roadmap artifact, not just config — it defines the v1 scope of the feature you ship to teachers.PlanApplier remains the sole writer. That lets you ship an AI editing feature without opening a second write path into production data — the single biggest objection in any review.ChangePlan) with typed operations (attach()/detach() now included), you can decide whether v1 ships a review screen, an inline diff, or a chat-style "here's what I'd change" confirmation, without changing the backend contract.catalog_overview, catalog_search, catalog_get mean "rename the Trespass course" resolves to an edit rather than a duplicate record. This moves the feature from demo-grade to actually usable for maintenance work on an existing catalog — a different (and much larger) use case than greenfield creation.GuardsDeletion) → (future) auto-apply on low-risk operations. You can commit to stages publicly while deferring the risky ones.TeachersAid::tools(ChangePlan), systemPrompt(), prompt(), TOOL_NAMES, plus PrismTools::live(), mean the agent loop can live in your app or in an external harness. That's a decision about where conversation state and orchestration live — relevant if you already have an agent runtime or chat surface.tools() lets a teacher refine ("actually make it 6 hours") across turns, which is the difference between a one-shot generator and something people will use repeatedly.GuardsDeletion is a host-veto hook asked both at proposal time and at apply time. Product-wise this is how you answer "what stops the AI deleting a course?" without forbidding deletes entirely.ref, unknown entity — and the model gets "Refused: …" back. Fewer dead proposals reaching the teacher's Apply button; the agent can self-correct in-conversation instead of dumping errors on a human.Consider it when most of these hold:
tools().Look elsewhere or wait when:
Migration note for anyone evaluating against a draft config: an entity missing from entities is now refused at proposal time rather than recorded and failing at Apply. If your config omits something (the release calls out question), add it explicitly — otherwise those proposals silently stop being made, which can look like a model regression.
For executives: This package lets an AI assistant do the tedious parts of catalog maintenance — renaming, repricing, re-linking courses — while a teacher keeps the final say on every change. The agent can only propose; one component applies, and only after approval. Scope is bounded by configuration, and deletes can be vetoed by the host application. It converts an open-ended "add AI to our authoring tool" initiative into a bounded integration with a clear approval gate — worth a scoped pilot rather than a roadmap commitment.
For engineering: Small, opinionated surface. Tools are declared and scoped via teachers-aid.entities / teachers-aid.relations; mutating tools record typed operations into a ChangePlan; PlanApplier is the only writer; GuardsDeletion provides host veto on deletes at both propose and apply time. Proposals are validated at creation (unknown entity, bad field, missing id, dangling $ref) and refusals are returned to the model as text so it can self-correct. The driver is optional and may be a closure — only respondTo() needs one. If you already use Prism, PrismTools::live() adapts tools; if you own the loop, TeachersAid::tools($plan) plus systemPrompt()/prompt()/TOOL_NAMES let you drive it yourself and carry a pending plan across turns. Trade-off to accept: pre-1.0, and refusal semantics changed in this release — audit your entity config before upgrading.
How can I help you explore Laravel packages today?