Skip to content

LLM Resources

Plugins โ€‹

Eighteen official plugins, each installable on any plant:

js
import watering from '@smartplant/watering'

await plant.use( watering )
const { advice, daysUntilWater } = await plant.plugin( 'watering' ).predictWatering()
PluginMethodAlso does locally, with no AI
๐Ÿ’ง @smartplant/wateringpredictWatering()Reacts to plant:thirsty
โš ๏ธ @smartplant/alertscheckAlerts()Stays silent โ€” and free โ€” when nothing is wrong
๐Ÿ“ˆ @smartplant/historyanalyzeTrends()stats(), series(); reports "unknown" rather than inventing a trend
โ˜€๏ธ @smartplant/lightingoptimizeLight()dailyLightHours()
๐Ÿ’จ @smartplant/ventilationadjustVentilation()vpd() โ€” vapour pressure deficit via the Tetens equation
๐Ÿ˜Ÿ @smartplant/stressdetectStress()chronicScore() โ€” fraction of 48h spent below comfort
๐Ÿ› @smartplant/pestsmonitorPests()identify( symptoms ), logged to care history
๐ŸŒฑ @smartplant/fertilizerguideFertilization()Errs toward underfeeding โ€” burn is harder to undo than deficiency
๐Ÿ“” @smartplant/diarylogAndSummarize()The plant writes its own journal, stored in memory
๐Ÿ”ฎ @smartplant/simulatorsimulateConditions()score(), sweep() โ€” find where tolerance breaks, instantly
๐Ÿ”ฌ @smartplant/spectrumdiagnose()probe(), treat(), doses() โ€” ๐Ÿ”ต๐ŸŸข๐Ÿ”ด interrogation with hard interlocks
๐Ÿงฌ @smartplant/migrationbequeath()receive(), wouldSuit(), outcome() โ€” inheritance between plants of one species
๐Ÿ—จ @smartplant/colonyaskPeer()askAll(), report(), corroborate() โ€” a channel between plants a person can watch but not enter
๐Ÿชด @smartplant/transplantplan()space(), settling() โ€” notices the pot filling up months before a person does, and never repots anything
๐ŸŒก @smartplant/thermalstress()evenness(), map() โ€” the whole canopy at once, which one leaf clip cannot see
๐Ÿ“ก @smartplant/presenceuvbAllowed()room(), explains() โ€” the UV-B interlock, and motion as a control on electrical events
๐Ÿ‚ @smartplant/seasonranges()now(), lastYear() โ€” bends care to the time of year, and fades as the plant learns its own
๐Ÿ”‹ @smartplant/energyforecast()plan(), canTravel() โ€” what runs off a panel and a battery, and what sleeps

Writing your own takes one function:

js
import { definePlugin } from 'smartplant'

export default definePlugin( {
  name    : 'repotting',
  persona : 'botanist',
  schema  : { advice : '', urgency : 'low' },

  on : {
    async 'plant:stressed'( event ) {
      console.log( await this.whenToRepot() )
    },
  },

  methods : {
    async whenToRepot( input = {} ) {
      return this.ask( 'Is this plant root-bound?', { extra : input } )
    },
  },
} )

Inside a plugin, this.plant is the kernel, this.ask() runs a context-injected structured AI call, and listeners detach automatically on destroy().