From fc1246a75791303286377008cccbf4cf408664d4 Mon Sep 17 00:00:00 2001 From: Ed Spencer Date: Mon, 26 Aug 2024 09:28:54 -0400 Subject: [PATCH] README improvements --- .changeset/quiet-vans-battle.md | 5 +++++ README.md | 12 +++++++----- docs/magic-square.png | Bin 0 -> 35353 bytes 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 .changeset/quiet-vans-battle.md create mode 100644 docs/magic-square.png diff --git a/.changeset/quiet-vans-battle.md b/.changeset/quiet-vans-battle.md new file mode 100644 index 0000000..df21958 --- /dev/null +++ b/.changeset/quiet-vans-battle.md @@ -0,0 +1,5 @@ +--- +"inform-ai": patch +--- + +README improvements diff --git a/README.md b/README.md index d1cf358..8f405f7 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,10 @@ InformAI doesn't directly send data to your LLM but simplifies integration with tools like the Vercel AI SDK, making it easy to incorporate AI into your app. +If ChatGPT and other LLMs can read and write text, and Vercel AI SDK adds the ability to write UI by streaming React components as part of an LLM response, InformAI fills in the missing piece by allowing the LLM to read your UI as well as write to it: + +![Where InformAI fits](/docs/magic-square.png) + ## Installation Install the NPM package: @@ -160,8 +164,6 @@ export function Table({ data, colHeaders, name = "Table", informPrompt = default The `type` and `description` we pass can be any strings we like. -`useInformAI` - ## Viewing Current State Under the covers, InformAI collects together all of the component state and event messages that are published by `` and `useInformAI`. While in development, it's useful to be able to see what InformAI is aware of, and what will be sent with the next user message to the LLM. @@ -492,7 +494,7 @@ The 'Last Sent' message at the bottom tells us that all of the messages above we [ { id: '492b4wc', - content: 'Component adc51d8c-8ada-464a-a924-3f2ddb604b16 has updated its state\n' + + content: 'Component adc51d has updated its state\n' + 'Component Name: Schedule Detail Page\n' + "Component self-description: A page that shows the details of a schedule. It should show the schedule's configuration, the devices in the schedule, and recent jobs for the schedule. It should also have buttons to run the schedule, edit the schedule, and delete the schedule.\n" + 'Component props: {"schedule":{"id":6,"disabled":false,"cron":"0 0 * * *","name":"Daily","devices":"21,19,83","createdAt":"2024-06-14T19:55:29.825Z","updatedAt":"2024-08-13T21:17:43.936Z"},"devices":[{"id":21,"type":"tplink","hostname":"masterclosetswitch.local","credentials":"fdbec89f1c1bb41b0e55d60f46092da3:7391a495c95411ebc5f087c4b8f5bcfb2b903d370cedd6a819a9e69b15f03999b9fbc4378a5254751ddb038bfec87facd5b642d0aa28b48b9ecf675b0deceb28","config":"{}","createdAt":"2024-06-14T19:55:29.824Z","updatedAt":"2024-06-14T19:55:29.824Z"},{"id":19,"type":"opnsense","hostname":"firewall.local","credentials":"dd503eaafa2acdae999023a63735b7b8:9af028d461a8b3aea27c6edc013d64e98d33476d8614bdd0ad1cab42601a2517c01cc0342b6946fee8bb5a31ceaa26a659b37051da1584ba163360f9465997154ff7f9344ff5726683fe6183e6e7054f622aeeaaa2402dc416e5ae6edea6cb34ff9d80720bb9942d2ccb90015821f8fa103ec0f116bcc3532b2ff285dad80ec56c90503996b094daf52b5775b224b137a8ba0dc13d29e2e4c37d244ff10bda30bc7ed892390efc3e3ac19dd0845e7cb0e6b3cd88c2f126d2f8d9b7191f85f72f","config":"{}","createdAt":"2024-06-14T19:55:29.823Z","updatedAt":"2024-06-16T16:06:39.091Z"},{"id":83,"type":"hass","hostname":"13232pct.duckdns.org","credentials":"6628e50a7bd550741dd1963ef98bfb67:107376648f66355e19787eb82036ea506a9cae6152ed98f1f1739640d2a930f30c54683c9bc3eaebd49043434afeed16b7928ba31b44048477b40d68f2a1638d83a9e1aaf83f015ffc53ed5114eb77fd90e06cfe3f52f804d9433056b985a0f00358e42d04733440e7c3c245a926266e3f5d1232022850baa970e38d8a33b032e1ccdadc563574420447cacb8498dbb637dfdfa19272cf226df112730cd8e4282e09ce99c30e0854c7ca5144426ad8f7f349fcffea7da3f7970c3ad5af9b33023ad7f057ad4144817f9df0e4c69e1466","config":"{\\"port\\":\\"3000\\"}","createdAt":"2024-07-16T17:13:33.455Z","updatedAt":"2024-07-16T17:13:33.455Z"}],"jobs":[{"id":24,"createdAt":"2024-08-13T21:17:54.387Z","updatedAt":"2024-08-13T21:18:31.499Z","startedAt":"2024-08-13T21:17:54.400Z","finishedAt":"2024-08-13T21:18:31.496Z","status":"completed","scheduleId":6,"_count":{"backups":3}},{"id":23,"createdAt":"2024-08-13T21:15:46.991Z","updatedAt":"2024-08-13T21:15:47.571Z","startedAt":"2024-08-13T21:15:47.004Z","finishedAt":"2024-08-13T21:15:47.570Z","status":"completed","scheduleId":6,"_count":{"backups":2}},{"id":22,"createdAt":"2024-08-13T21:09:42.083Z","updatedAt":"2024-08-13T21:09:42.083Z","startedAt":null,"finishedAt":null,"status":"pending","scheduleId":6,"_count":{"backups":1}},{"id":18,"createdAt":"2024-07-15T15:37:38.955Z","updatedAt":"2024-07-15T15:38:14.366Z","startedAt":"2024-07-15T15:37:38.967Z","finishedAt":"2024-07-15T15:38:14.365Z","status":"completed","scheduleId":6,"_count":{"backups":2}},{"id":17,"createdAt":"2024-07-15T15:36:30.814Z","updatedAt":"2024-07-15T15:37:06.483Z","startedAt":"2024-07-15T15:36:30.828Z","finishedAt":"2024-07-15T15:37:06.482Z","status":"completed","scheduleId":6,"_count":{"backups":2}}]}', @@ -506,7 +508,7 @@ The 'Last Sent' message at the bottom tells us that all of the messages above we { role: 'assistant', content: 'This schedule backs up 3 devices.' }, { id: '3Rytlyw', - content: 'Component 7df18442-843c-4fc8-a1cf-a5eaa5a9ba9a has updated its state\n' + + content: 'Component 2b5e1c has updated its state\n' + 'Component Name: 3 Most Recent Backups for firewall.local\n' + 'Component self-description: This table displays a list of backups taken for various devices. The data will be provided to you in JSON format\n' + 'Component props: {"backups":[{"id":65,"jobId":24,"deviceId":19,"createdAt":"2024-08-13T21:17:54.391Z","updatedAt":"2024-08-13T21:17:54.626Z","status":"completed","bytes":57117},{"id":63,"jobId":23,"deviceId":19,"createdAt":"2024-08-13T21:15:46.996Z","updatedAt":"2024-08-13T21:15:47.571Z","status":"completed","bytes":57117},{"id":61,"jobId":22,"deviceId":19,"createdAt":"2024-08-13T21:09:42.091Z","updatedAt":"2024-08-13T21:09:42.091Z","status":"pending","bytes":null}]}', @@ -530,7 +532,7 @@ The 'Last Sent' message at the bottom tells us that all of the messages above we It's a little dense to the human eye, but here we can see the first message is from the `system` role, and is a string representation of the content that we supplied to `` in our `SchedulePage` React component. After that we see our user message, followed by another `system` message that InformAI injected for us because the `` was streamed in as a response and published data to InformAI. -The internal messages stored by InformAI are converted into LLM-friendly strings via the [mapComponentMessages](https://github.com/edspencer/inform-ai/blob/main/src/utils.ts) function, but it's easy to swap that out for any function you like. The default `mapComponentMessages` function just delegates to a function that looks like this: +The internal messages stored by InformAI are converted into LLM-friendly strings via the [mapComponentMessages](https://github.com/edspencer/inform-ai/blob/main/src/utils.tsx) function, but it's easy to swap that out for any function you like. The default `mapComponentMessages` function just delegates to a function that looks like this: ```tsx export function mapStateToContent(state: StateMessage) { diff --git a/docs/magic-square.png b/docs/magic-square.png new file mode 100644 index 0000000000000000000000000000000000000000..05c72c53619dbdaa2d8c2c8d164d6f2f7f399073 GIT binary patch literal 35353 zcmeEucTki~&?l_BwkR+0$|+ zPz(%+4GtD~LWbNO0DquXQYumy7^PA8Cl6rY|MX@GnkpC=-pm*nfsZjTj=-b9B@7IA zZVZeS6ATQIcnl1RheOk;4=;e1oI-s1@H+I{KE*h!2m;{K4E~K zz|Vy=%zwX4gZ%mS0yOQypU)5*R6|ljx~Jg9`!?G5-0rC;i9q=;r4+3k%PUXtH>kqYrk5EfX}GMT-WG-HF2{OzjjYWonFSt#e!adlbe(K zngkv_J-wKVxuuBaZMlD52mcelX6@$oP=t%i)6nPB$CNe@Ak3 z{byQWf?TL?xNdQBbN%fbyefuzDx&6MV*y4+^)GQt>{rYG@a&&)#JEs{qY?9aroWzo zsY>99as6eR1RkZ)S8NOnIELbFDeXs?YtyigaDgt zMEGzaCIo|lFNDIKoqKXNPy2&a-&4jv3(iDRH5ZKE?LKNqVefT*x-WQoyx(WXHS4<_ zF>W5C((Tl6dbu!XeRpM;{gH%OD?!=*j8EdIae#PnWq97=Ab_ z2j5&*aOl;&F?9wD%8NZWXQUL3miODQlEBlbpjbpS@e(gsQhj+&#WrH-{0|st39OT! zbJYvgt@NkMBwix0mN9F6q39IFg0o;85K4)XOSpZIma1?I0ky!*d-Ym5s_FSBW7H3% zpd`6BF!{ffG98O-RXR)}{Z6`Wmc2-Dsy`f<{35`j9B(r5!O7{hflJ57$`79}D#Z&p zOvGR2(2M{6TEEx6`upo_tG*O3hmg=14mkYf+G^K0gE|=`;Ox+GxyYiKk39c;51Hxpn}C?axdFz3yKN7$h0-(+85euRZ_QyR~NZ0og7r_ zxp_4oSN&yrpvjLG3c+oV~YmQoQqpw;C_> z(71NLN@*p7zJ=o8yw#2m!+^+=z01(geO6mqdW$uEK!JjcMU_BgGB4S_xcu8Qc0?Cv zZJ}aLjlrr;vv0+2#q#lH!v{65+ZaJme6h2G`Sh|$o1A3nlKJ|Fc9i9jA|#XLizz-- zr`3wHw;bW`dPP=A2&&*>eXL;eufiyC=wC)P0+JrcMNnDDMbc27*tFM@GRnmZQJxtb zQ%d+&37>2=_kg8}xBHTxDCu{!vvcc^(J%8i6ByGf&mFC19V*9}#UbkTEXx$v4lt#Q z*E#BT2C6SVkbwL#AguT1PWNX8OFsU*qyDp`O*4D5{|z3ulW9yl+V|S5j}QmBK7wdOq+ptX<|0aNn=W-+YDqXrt1tFuD6F- zPHPd5wJTHH@(zYpi4K)JB2<+36Kvhviz+ganzmHmnIkAtIP%ESTS-|M0^tsLAGdo& z(=X`0G*&=}xZBpqlo}c*oY>o(9Q;@w2kT*fB&*bVeGX^nLPr z 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 U3*Tza9s)lt^}9FARBglm7ihX<@Bjb+ literal 0 HcmV?d00001