@nodetool-ai/websocket 0.8.4-a24.3 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/example-workflows.d.ts +2 -0
  3. package/dist/example-workflows.d.ts.map +1 -1
  4. package/dist/example-workflows.js +16 -4
  5. package/dist/example-workflows.js.map +1 -1
  6. package/dist/examples/nodetool-base/A Campaign Concept from a Brief.json +135 -0
  7. package/dist/examples/nodetool-base/A Gradient Card as PNG.json +128 -0
  8. package/dist/examples/nodetool-base/A Poster in Portrait.json +129 -0
  9. package/dist/examples/nodetool-base/A Repeating Texture Tile.json +129 -0
  10. package/dist/examples/nodetool-base/A Run Button for Any Job.json +152 -0
  11. package/dist/examples/nodetool-base/A Webhook That Answers.json +170 -0
  12. package/dist/examples/nodetool-base/AI Spokesperson.json +328 -0
  13. package/dist/examples/nodetool-base/Action Items from a Meeting Recording.json +198 -0
  14. package/dist/examples/nodetool-base/Ad Copy in Three Registers.json +135 -0
  15. package/dist/examples/nodetool-base/Ad Loop from a Product Photo.json +277 -0
  16. package/dist/examples/nodetool-base/Add Reverb to a Voice.json +125 -0
  17. package/dist/examples/nodetool-base/Album Art from a Mood.json +129 -0
  18. package/dist/examples/nodetool-base/Assemble a UGC Product Video.json +158 -0
  19. package/dist/examples/nodetool-base/Audio To Image.json +184 -0
  20. package/dist/examples/nodetool-base/B-Roll Reel from a Brief.json +339 -0
  21. package/dist/examples/nodetool-base/Batch a List.json +171 -0
  22. package/dist/examples/nodetool-base/Black and White, Hard.json +147 -0
  23. package/dist/examples/nodetool-base/Blog Post to Social Thread.json +135 -0
  24. package/dist/examples/nodetool-base/Blur a Channel.json +205 -0
  25. package/dist/examples/nodetool-base/Blur an Image.json +179 -0
  26. package/dist/examples/nodetool-base/Boost Saturation.json +178 -0
  27. package/dist/examples/nodetool-base/Brand Asset Generator.json +585 -0
  28. package/dist/examples/nodetool-base/Brand a UGC Product Video.json +402 -0
  29. package/dist/examples/nodetool-base/Bring a Still to Life.json +250 -0
  30. package/dist/examples/nodetool-base/Bullet Points to Press Release.json +135 -0
  31. package/dist/examples/nodetool-base/Chapter Markers for a Long Recording.json +198 -0
  32. package/dist/examples/nodetool-base/Chat With Your Documents.json +569 -0
  33. package/dist/examples/nodetool-base/Chunk a Transcript for Indexing.json +202 -0
  34. package/dist/examples/nodetool-base/Circles and Lines.json +126 -0
  35. package/dist/examples/nodetool-base/Clean Up a Rough Voice Recording.json +208 -0
  36. package/dist/examples/nodetool-base/Clip on Kie.json +173 -0
  37. package/dist/examples/nodetool-base/Cold Outreach Co-Pilot.json +423 -0
  38. package/dist/examples/nodetool-base/Color Boost Video.json +250 -0
  39. package/dist/examples/nodetool-base/Compose Directed Campaign Formats.json +764 -0
  40. package/dist/examples/nodetool-base/Concept Art Iteration Board.json +439 -0
  41. package/dist/examples/nodetool-base/Concept Art, Then a Moving Version.json +173 -0
  42. package/dist/examples/nodetool-base/Conditional Logic Engine.json +535 -0
  43. package/dist/examples/nodetool-base/Count a List.json +168 -0
  44. package/dist/examples/nodetool-base/Count to Three with a Loop.json +157 -0
  45. package/dist/examples/nodetool-base/Crop an Image.json +181 -0
  46. package/dist/examples/nodetool-base/Crop then Fit.json +208 -0
  47. package/dist/examples/nodetool-base/Crush It to 8 Bits.json +123 -0
  48. package/dist/examples/nodetool-base/Cut Out the Subject.json +184 -0
  49. package/dist/examples/nodetool-base/Cut a Landscape Clip for Vertical.json +123 -0
  50. package/dist/examples/nodetool-base/Cut a Product Out of Its Background.json +238 -0
  51. package/dist/examples/nodetool-base/Data Generator.json +216 -0
  52. package/dist/examples/nodetool-base/Denoise Footage.json +178 -0
  53. package/dist/examples/nodetool-base/Direct a Short Film.json +305 -0
  54. package/dist/examples/nodetool-base/Directed Film to Timeline.json +385 -0
  55. package/dist/examples/nodetool-base/Does This Text Mention the Deadline.json +130 -0
  56. package/dist/examples/nodetool-base/Draft Answers for an FAQ.json +135 -0
  57. package/dist/examples/nodetool-base/Draw a Badge in SVG.json +126 -0
  58. package/dist/examples/nodetool-base/Drop Duplicates.json +170 -0
  59. package/dist/examples/nodetool-base/Drop the First Few.json +148 -0
  60. package/dist/examples/nodetool-base/Dungeon and Ruins Starter Pack.json +786 -0
  61. package/dist/examples/nodetool-base/Edit a Still with Words.json +284 -0
  62. package/dist/examples/nodetool-base/Editorial Still from a Line.json +197 -0
  63. package/dist/examples/nodetool-base/Emboss a Still.json +120 -0
  64. package/dist/examples/nodetool-base/Every Combination.json +225 -0
  65. package/dist/examples/nodetool-base/Every Hour, On the Hour.json +162 -0
  66. package/dist/examples/nodetool-base/Executive Summary of a Long Document.json +135 -0
  67. package/dist/examples/nodetool-base/Explainer Clip from a Paragraph.json +244 -0
  68. package/dist/examples/nodetool-base/Extract the Claims Worth Checking.json +135 -0
  69. package/dist/examples/nodetool-base/Fade Audio In and Out.json +203 -0
  70. package/dist/examples/nodetool-base/Fade Audio Out.json +202 -0
  71. package/dist/examples/nodetool-base/Fill a Template.json +149 -0
  72. package/dist/examples/nodetool-base/Find Every Number in a Sentence.json +127 -0
  73. package/dist/examples/nodetool-base/Find and Replace.json +224 -0
  74. package/dist/examples/nodetool-base/Find the Edges.json +123 -0
  75. package/dist/examples/nodetool-base/Fit an Image.json +179 -0
  76. package/dist/examples/nodetool-base/Five Headlines for a Landing Page.json +135 -0
  77. package/dist/examples/nodetool-base/Flashcard Generator.json +297 -0
  78. package/dist/examples/nodetool-base/Gate Out the Room Noise.json +124 -0
  79. package/dist/examples/nodetool-base/Generate a Native-Audio UGC Testimonial.json +276 -0
  80. package/dist/examples/nodetool-base/Generate a Silent Bed.json +126 -0
  81. package/dist/examples/nodetool-base/Generate then Upscale a Poster.json +164 -0
  82. package/dist/examples/nodetool-base/Hacker News Agent.json +183 -0
  83. package/dist/examples/nodetool-base/Hook & Thumbnail Factory.json +498 -0
  84. package/dist/examples/nodetool-base/How Long Is This Transcript.json +185 -0
  85. package/dist/examples/nodetool-base/Image Enhance.json +272 -0
  86. package/dist/examples/nodetool-base/Image To Audio Story.json +180 -0
  87. package/dist/examples/nodetool-base/Image to Video Animation.json +346 -0
  88. package/dist/examples/nodetool-base/Inspect a Clip's Audio.json +187 -0
  89. package/dist/examples/nodetool-base/Inspect a Clip.json +163 -0
  90. package/dist/examples/nodetool-base/Invert a Still.json +120 -0
  91. package/dist/examples/nodetool-base/Keep Only the Long Lines.json +220 -0
  92. package/dist/examples/nodetool-base/Keep Only the Matches.json +148 -0
  93. package/dist/examples/nodetool-base/Key Out a Green Screen.json +124 -0
  94. package/dist/examples/nodetool-base/Last One Wins.json +144 -0
  95. package/dist/examples/nodetool-base/Lip-sync a Clip to a Voice Track.json +313 -0
  96. package/dist/examples/nodetool-base/Localise a Product Listing.json +135 -0
  97. package/dist/examples/nodetool-base/Localise a Script and Revoice It.json +242 -0
  98. package/dist/examples/nodetool-base/Localized Explainer.json +430 -0
  99. package/dist/examples/nodetool-base/Low-poly Adventure Starter Pack.json +786 -0
  100. package/dist/examples/nodetool-base/Low-poly Seaside Starter Pack.json +786 -0
  101. package/dist/examples/nodetool-base/Master a Voice Track.json +180 -0
  102. package/dist/examples/nodetool-base/Meeting Transcript Summarizer.json +524 -0
  103. package/dist/examples/nodetool-base/Model Arena.json +550 -0
  104. package/dist/examples/nodetool-base/Moodboard Frame from a Theme.json +129 -0
  105. package/dist/examples/nodetool-base/Movie Posters.json +660 -0
  106. package/dist/examples/nodetool-base/Movie Trailer Generator.json +418 -0
  107. package/dist/examples/nodetool-base/Music Video Visualizer.json +720 -0
  108. package/dist/examples/nodetool-base/Name a File from Its Narration.json +231 -0
  109. package/dist/examples/nodetool-base/Narrate a Script.json +169 -0
  110. package/dist/examples/nodetool-base/Narration with a Music Bed.json +360 -0
  111. package/dist/examples/nodetool-base/Normalize a Clip's Audio.json +201 -0
  112. package/dist/examples/nodetool-base/One Tagline, Six Markets.json +135 -0
  113. package/dist/examples/nodetool-base/Pad a Canvas.json +188 -0
  114. package/dist/examples/nodetool-base/Per-SKU Ad Factory.json +511 -0
  115. package/dist/examples/nodetool-base/Photo Enhancement Suite.json +417 -0
  116. package/dist/examples/nodetool-base/Picture in Picture.json +231 -0
  117. package/dist/examples/nodetool-base/Pitch a Voice Up.json +122 -0
  118. package/dist/examples/nodetool-base/Pixelate a Still.json +122 -0
  119. package/dist/examples/nodetool-base/Platformer Playground Starter Pack.json +786 -0
  120. package/dist/examples/nodetool-base/Podcast Episode to Show Notes.json +198 -0
  121. package/dist/examples/nodetool-base/Podcast Repurposing Studio.json +745 -0
  122. package/dist/examples/nodetool-base/Pokemon Maker.json +282 -0
  123. package/dist/examples/nodetool-base/Poster on Kie.json +172 -0
  124. package/dist/examples/nodetool-base/Posterize to Four Bits.json +122 -0
  125. package/dist/examples/nodetool-base/Private Assistant.json +236 -0
  126. package/dist/examples/nodetool-base/Product Mockup Generator.json +608 -0
  127. package/dist/examples/nodetool-base/Product Spot from Text.json +330 -0
  128. package/dist/examples/nodetool-base/Product Video Generator.json +344 -0
  129. package/dist/examples/nodetool-base/Prompt Template.json +221 -0
  130. package/dist/examples/nodetool-base/Propose Three Campaign Directions.json +614 -0
  131. package/dist/examples/nodetool-base/Pull a Field out of JSON Text.json +128 -0
  132. package/dist/examples/nodetool-base/Pull a Still from a Clip.json +179 -0
  133. package/dist/examples/nodetool-base/Pull the Quotable Lines Out of an Interview.json +198 -0
  134. package/dist/examples/nodetool-base/Put a Product on a Studio Backdrop.json +252 -0
  135. package/dist/examples/nodetool-base/Put a Voice Over a Music Bed.json +358 -0
  136. package/dist/examples/nodetool-base/README_EXAMPLES.md +59 -0
  137. package/dist/examples/nodetool-base/Re-delimit a List.json +199 -0
  138. package/dist/examples/nodetool-base/Read a Clip's Frame Rate.json +120 -0
  139. package/dist/examples/nodetool-base/Redact Email Addresses.json +129 -0
  140. package/dist/examples/nodetool-base/Redact and Tidy a Log Line.json +266 -0
  141. package/dist/examples/nodetool-base/Relight a Product for a Seasonal Campaign.json +131 -0
  142. package/dist/examples/nodetool-base/Render a Directed Campaign Hero.json +338 -0
  143. package/dist/examples/nodetool-base/Reopen a Directed Campaign.json +1748 -0
  144. package/dist/examples/nodetool-base/Research Agent.json +231 -0
  145. package/dist/examples/nodetool-base/Research a Brand from Its Website.json +445 -0
  146. package/dist/examples/nodetool-base/Restyle a Photo as an Illustration.json +136 -0
  147. package/dist/examples/nodetool-base/Reverse Audio.json +201 -0
  148. package/dist/examples/nodetool-base/Reverse a Clip.json +176 -0
  149. package/dist/examples/nodetool-base/Revise an Accepted Campaign Hero.json +486 -0
  150. package/dist/examples/nodetool-base/Rewrite This So a Customer Understands It.json +135 -0
  151. package/dist/examples/nodetool-base/Rotate Footage.json +178 -0
  152. package/dist/examples/nodetool-base/SEO Content Engine.json +708 -0
  153. package/dist/examples/nodetool-base/SEO Title and Meta Description.json +135 -0
  154. package/dist/examples/nodetool-base/Sci-fi Game Model Starter Pack.json +693 -0
  155. package/dist/examples/nodetool-base/Sci-fi Outpost Expansion.json +601 -0
  156. package/dist/examples/nodetool-base/Score a Clip from Its Own Mood.json +229 -0
  157. package/dist/examples/nodetool-base/Score a Silent Clip.json +382 -0
  158. package/dist/examples/nodetool-base/Script to Narrated Clip.json +224 -0
  159. package/dist/examples/nodetool-base/Script to Screen.json +940 -0
  160. package/dist/examples/nodetool-base/Sharpen Footage.json +179 -0
  161. package/dist/examples/nodetool-base/Shot List from a Synopsis.json +136 -0
  162. package/dist/examples/nodetool-base/Single Shot from a Line.json +199 -0
  163. package/dist/examples/nodetool-base/Slice Text.json +159 -0
  164. package/dist/examples/nodetool-base/Slow a Clip Without Dropping Pitch.json +122 -0
  165. package/dist/examples/nodetool-base/Soften a Plate.json +178 -0
  166. package/dist/examples/nodetool-base/Solarize a Still.json +122 -0
  167. package/dist/examples/nodetool-base/Speak a Line, Then Trim the Silence.json +157 -0
  168. package/dist/examples/nodetool-base/Spin a Packshot into a Turntable Clip.json +137 -0
  169. package/dist/examples/nodetool-base/Split a Channel.json +178 -0
  170. package/dist/examples/nodetool-base/Split a Log into Records.json +128 -0
  171. package/dist/examples/nodetool-base/Stabilize Handheld.json +179 -0
  172. package/dist/examples/nodetool-base/Still on Replicate.json +172 -0
  173. package/dist/examples/nodetool-base/Subject Lines Worth Testing.json +135 -0
  174. package/dist/examples/nodetool-base/Subtitle Lines from a Script.json +170 -0
  175. package/dist/examples/nodetool-base/Subtitle Text from a Recording.json +198 -0
  176. package/dist/examples/nodetool-base/Summarise a Recorded Call.json +198 -0
  177. package/dist/examples/nodetool-base/Swirl and Echo.json +154 -0
  178. package/dist/examples/nodetool-base/Take While the Numbers Are Small.json +148 -0
  179. package/dist/examples/nodetool-base/Take a Product Shot to Print Resolution.json +209 -0
  180. package/dist/examples/nodetool-base/Take the First Few Seconds of a Bed.json +127 -0
  181. package/dist/examples/nodetool-base/Take the First Few.json +170 -0
  182. package/dist/examples/nodetool-base/Telephone Voice.json +174 -0
  183. package/dist/examples/nodetool-base/Themes Across Customer Feedback.json +135 -0
  184. package/dist/examples/nodetool-base/Three Ratios.json +315 -0
  185. package/dist/examples/nodetool-base/Tidy Up Messy Text.json +199 -0
  186. package/dist/examples/nodetool-base/Top-down Native Asset Pack.json +955 -0
  187. package/dist/examples/nodetool-base/Trailer Beats from a Premise.json +136 -0
  188. package/dist/examples/nodetool-base/Transcribe Audio.json +138 -0
  189. package/dist/examples/nodetool-base/Transcribe a Clip.json +198 -0
  190. package/dist/examples/nodetool-base/Translate Marketing Copy to German.json +135 -0
  191. package/dist/examples/nodetool-base/Translate a Script for Dubbing.json +224 -0
  192. package/dist/examples/nodetool-base/Trim Audio to a Range.json +203 -0
  193. package/dist/examples/nodetool-base/Trim a Blurb to Length.json +128 -0
  194. package/dist/examples/nodetool-base/Trim a Clip.json +180 -0
  195. package/dist/examples/nodetool-base/Turn Research Notes into a Comparison Table.json +136 -0
  196. package/dist/examples/nodetool-base/Turn Specs into Product Copy.json +135 -0
  197. package/dist/examples/nodetool-base/Turn a Changelog into Release Notes.json +135 -0
  198. package/dist/examples/nodetool-base/Turn a Logo into Print-Ready Vector.json +126 -0
  199. package/dist/examples/nodetool-base/Turn a Support Thread into a Bug Report.json +135 -0
  200. package/dist/examples/nodetool-base/Turn a Talk into a Blog Post.json +198 -0
  201. package/dist/examples/nodetool-base/Upscale a Still.json +186 -0
  202. package/dist/examples/nodetool-base/Vectorize a Generated Logo.json +162 -0
  203. package/dist/examples/nodetool-base/Video Restyle Studio.json +281 -0
  204. package/dist/examples/nodetool-base/Vignette a Portrait.json +124 -0
  205. package/dist/examples/nodetool-base/Voice a Script in Two Voices.json +217 -0
  206. package/dist/examples/nodetool-base/Warm Up a Cold Clip.json +124 -0
  207. package/dist/examples/nodetool-base/Watch a Folder, Act on What Lands.json +177 -0
  208. package/dist/examples/nodetool-base/Widen a Mono Voice.json +151 -0
  209. package/dist/examples/nodetool-base/Workflow As A Tool.json +257 -0
  210. package/dist/examples/nodetool-base/Write a Listing from the Product Photo.json +139 -0
  211. package/dist/examples/nodetool-base/Write the Prompt, Then Make the Image.json +200 -0
  212. package/dist/examples/nodetool-base/gallery_thumbnail_generator.ts +384 -0
  213. package/dist/fake-runtime.d.ts.map +1 -1
  214. package/dist/fake-runtime.js +5 -1
  215. package/dist/fake-runtime.js.map +1 -1
  216. package/dist/http-api.d.ts.map +1 -1
  217. package/dist/http-api.js +20 -3
  218. package/dist/http-api.js.map +1 -1
  219. package/dist/lib/openverse.d.ts +47 -0
  220. package/dist/lib/openverse.d.ts.map +1 -0
  221. package/dist/lib/openverse.js +255 -0
  222. package/dist/lib/openverse.js.map +1 -0
  223. package/dist/model-execution-availability.d.ts.map +1 -1
  224. package/dist/model-execution-availability.js +7 -2
  225. package/dist/model-execution-availability.js.map +1 -1
  226. package/dist/screenshot-server.js +87 -49
  227. package/dist/screenshot-server.js.map +1 -1
  228. package/dist/trpc/router.d.ts +2 -0
  229. package/dist/trpc/router.d.ts.map +1 -1
  230. package/dist/trpc/router.js +2 -0
  231. package/dist/trpc/router.js.map +1 -1
  232. package/dist/trpc/routers/games.d.ts +179 -0
  233. package/dist/trpc/routers/games.d.ts.map +1 -1
  234. package/dist/trpc/routers/games.js +1 -1
  235. package/dist/trpc/routers/games.js.map +1 -1
  236. package/dist/trpc/routers/models.d.ts +270 -0
  237. package/dist/trpc/routers/models.d.ts.map +1 -1
  238. package/dist/trpc/routers/models.js +37 -19
  239. package/dist/trpc/routers/models.js.map +1 -1
  240. package/dist/trpc/routers/openverse.d.ts +91 -0
  241. package/dist/trpc/routers/openverse.d.ts.map +1 -0
  242. package/dist/trpc/routers/openverse.js +98 -0
  243. package/dist/trpc/routers/openverse.js.map +1 -0
  244. package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
  245. package/dist/trpc/sandbox-coverage.js +11 -0
  246. package/dist/trpc/sandbox-coverage.js.map +1 -1
  247. package/dist/websocket-client-session.d.ts +8 -0
  248. package/dist/websocket-client-session.d.ts.map +1 -1
  249. package/dist/websocket-client-session.js +31 -1
  250. package/dist/websocket-client-session.js.map +1 -1
  251. package/package.json +27 -28
@@ -0,0 +1,231 @@
1
+ {
2
+ "id": "",
3
+ "access": "public",
4
+ "created_at": "2026-07-17T12:00:00.000Z",
5
+ "updated_at": "2026-07-17T12:00:00.000Z",
6
+ "name": "Research Agent",
7
+ "tool_name": null,
8
+ "description": "Give it a topic and an audience; the agent runs real web searches, opens the best sources, and streams back a cited markdown briefing. Differentiator: genuine multi-step tool use (search + browse) with inline citations — not a single prompt call.",
9
+ "tags": [
10
+ "agent",
11
+ "research",
12
+ "search",
13
+ "browser",
14
+ "streaming",
15
+ "citations",
16
+ "example"
17
+ ],
18
+ "thumbnail": null,
19
+ "thumbnail_url": null,
20
+ "graph": {
21
+ "nodes": [
22
+ {
23
+ "id": "comment-intro",
24
+ "parent_id": null,
25
+ "type": "nodetool.workflows.base_node.Comment",
26
+ "data": {
27
+ "comment": "# 🔎 Research Agent\n\nType a topic, name the audience, and get back a sourced briefing. Use it when you need a cited summary built from pages the agent actually opened, not from one prompt call.\n\n**How it works:** \"Topic\" and \"Audience\" fill the template in \"Compose research objective\", which asks for 3 to 5 research questions, cross-checked claims and a markdown brief with short takeaways and a numbered source list. \"Research agent (search + browse)\" receives that objective and loops over its two tools, web_search and browser, opening pages to verify details. Its text streams into \"Cited brief\" with inline [n] citations. Pick a language model on the agent before running. The search and browser tools reach the open web.\n\n**Try this:** Change \"Audience\" to \"a non-technical executive deciding on budget\" and compare the depth and framing of the new brief."
28
+ },
29
+ "ui_properties": {
30
+ "selected": false,
31
+ "position": {
32
+ "x": 0,
33
+ "y": 0
34
+ },
35
+ "zIndex": 0,
36
+ "width": 560,
37
+ "height": 382,
38
+ "selectable": true
39
+ },
40
+ "dynamic_properties": {},
41
+ "dynamic_outputs": {}
42
+ },
43
+ {
44
+ "id": "input-topic",
45
+ "parent_id": null,
46
+ "type": "nodetool.input.StringInput",
47
+ "data": {
48
+ "name": "topic",
49
+ "value": "Small language models running on-device in 2026",
50
+ "description": "What to research — a subject, question, or claim to investigate.",
51
+ "line_mode": "multi_line"
52
+ },
53
+ "ui_properties": {
54
+ "title": "1️⃣ Topic",
55
+ "position": {
56
+ "x": 0,
57
+ "y": 719
58
+ },
59
+ "zIndex": 0,
60
+ "width": 280,
61
+ "selectable": true
62
+ },
63
+ "dynamic_properties": {},
64
+ "dynamic_outputs": {}
65
+ },
66
+ {
67
+ "id": "input-audience",
68
+ "parent_id": null,
69
+ "type": "nodetool.input.StringInput",
70
+ "data": {
71
+ "name": "audience",
72
+ "value": "a technical product team deciding whether to adopt on-device models",
73
+ "description": "Who the brief is for — sets the depth, framing, and what to emphasize.",
74
+ "line_mode": "multi_line"
75
+ },
76
+ "ui_properties": {
77
+ "title": "2️⃣ Audience",
78
+ "position": {
79
+ "x": 0,
80
+ "y": 944
81
+ },
82
+ "zIndex": 0,
83
+ "width": 280,
84
+ "selectable": true
85
+ },
86
+ "dynamic_properties": {},
87
+ "dynamic_outputs": {}
88
+ },
89
+ {
90
+ "id": "compose-objective",
91
+ "parent_id": null,
92
+ "type": "nodetool.text.Prompt",
93
+ "data": {
94
+ "prompt": "Research the topic below and write a briefing document for the stated audience.\n\nTOPIC: {{ topic }}\nAUDIENCE: {{ audience }}\n\nMethod:\n1. Break the topic into 3–5 concrete research questions.\n2. Use web_search to find authoritative, recent sources for each question.\n3. Use the browser tool to open the most promising results and pull out specifics — facts, figures, dates, direct quotes. Do not rely on search snippets alone.\n4. Cross-check every claim against at least two sources before stating it as fact.\n\nWrite the answer as a single markdown document with:\n- A `#` title naming the topic.\n- A **TL;DR** section: 3–4 bullet takeaways written for the audience.\n- Themed `##` sections covering the key findings, in a logical order.\n- A final **Sources** section: a numbered list of every URL you actually opened, as markdown links.\n\nCitations:\n- Put an inline [n] marker after any specific claim, matching the numbered entry in Sources.\n- Tailor depth and framing to the AUDIENCE.\n- Keep the tone neutral and precise, no filler. If sources disagree, say so and note which you trust more and why."
95
+ },
96
+ "ui_properties": {
97
+ "title": "3️⃣ Compose research objective",
98
+ "position": {
99
+ "x": 380,
100
+ "y": 462
101
+ },
102
+ "zIndex": 0,
103
+ "width": 340,
104
+ "selectable": true
105
+ },
106
+ "dynamic_properties": {
107
+ "topic": "Small language models running on-device in 2026",
108
+ "audience": "a technical product team deciding whether to adopt on-device models"
109
+ },
110
+ "dynamic_outputs": {}
111
+ },
112
+ {
113
+ "id": "research-agent",
114
+ "parent_id": null,
115
+ "type": "nodetool.agents.Agent",
116
+ "data": {
117
+ "model": {
118
+ "type": "language_model",
119
+ "provider": "",
120
+ "id": "",
121
+ "name": "",
122
+ "path": null,
123
+ "supported_tasks": []
124
+ },
125
+ "system": "You are a research analyst. You produce accurate, well-sourced briefings for a specific audience.\n\nYou have two tools:\n- web_search: find sources on the open web.\n- browser: open a URL and read its full content.\n\nMethod:\n- Search first, then open the best results with the browser to verify details — never state a fact from a search snippet alone.\n- Prefer primary sources and recent, reputable material.\n- Every factual claim must trace to a page you actually opened.\n- When evidence is thin or sources conflict, say so plainly instead of guessing.\n\nOutput: a single markdown document. Use inline [n] citation markers tied to a numbered Sources list. Write it as you go so the reader sees progress.",
126
+ "prompt": "",
127
+ "tools": [
128
+ {
129
+ "type": "tool_name",
130
+ "name": "web_search"
131
+ },
132
+ {
133
+ "type": "tool_name",
134
+ "name": "browser"
135
+ }
136
+ ],
137
+ "image": [],
138
+ "audio": [],
139
+ "history": [],
140
+ "thread_id": "",
141
+ "max_tokens": 100000
142
+ },
143
+ "ui_properties": {
144
+ "title": "4️⃣ Research agent (search + browse)",
145
+ "position": {
146
+ "x": 820,
147
+ "y": 812
148
+ },
149
+ "zIndex": 0,
150
+ "width": 320,
151
+ "selectable": true
152
+ },
153
+ "dynamic_properties": {},
154
+ "dynamic_outputs": {}
155
+ },
156
+ {
157
+ "id": "output-brief",
158
+ "parent_id": null,
159
+ "type": "nodetool.output.Output",
160
+ "data": {
161
+ "name": "brief"
162
+ },
163
+ "ui_properties": {
164
+ "title": "5️⃣ Cited brief",
165
+ "position": {
166
+ "x": 1240,
167
+ "y": 844
168
+ },
169
+ "zIndex": 0,
170
+ "width": 280,
171
+ "selectable": true
172
+ },
173
+ "dynamic_properties": {},
174
+ "dynamic_outputs": {}
175
+ }
176
+ ],
177
+ "edges": [
178
+ {
179
+ "id": "e-topic-compose",
180
+ "source": "input-topic",
181
+ "sourceHandle": "output",
182
+ "target": "compose-objective",
183
+ "targetHandle": "topic",
184
+ "ui_properties": {
185
+ "className": "str"
186
+ }
187
+ },
188
+ {
189
+ "id": "e-audience-compose",
190
+ "source": "input-audience",
191
+ "sourceHandle": "output",
192
+ "target": "compose-objective",
193
+ "targetHandle": "audience",
194
+ "ui_properties": {
195
+ "className": "str"
196
+ }
197
+ },
198
+ {
199
+ "id": "e-compose-agent",
200
+ "source": "compose-objective",
201
+ "sourceHandle": "output",
202
+ "target": "research-agent",
203
+ "targetHandle": "prompt",
204
+ "ui_properties": {
205
+ "className": "str"
206
+ }
207
+ },
208
+ {
209
+ "id": "e-agent-output",
210
+ "source": "research-agent",
211
+ "sourceHandle": "text",
212
+ "target": "output-brief",
213
+ "targetHandle": "value",
214
+ "ui_properties": {
215
+ "className": "str"
216
+ },
217
+ "edge_type": "data"
218
+ }
219
+ ]
220
+ },
221
+ "input_schema": null,
222
+ "output_schema": null,
223
+ "settings": {},
224
+ "package_name": "nodetool-base",
225
+ "path": null,
226
+ "run_mode": "workflow",
227
+ "workspace_id": null,
228
+ "required_providers": null,
229
+ "required_models": null,
230
+ "html_app": null
231
+ }
@@ -0,0 +1,445 @@
1
+ {
2
+ "id": "",
3
+ "access": "private",
4
+ "created_at": "2026-10-03T00:00:00.000000",
5
+ "updated_at": "2026-10-03T00:00:00.000000",
6
+ "name": "Research a Brand from Its Website",
7
+ "tool_name": null,
8
+ "description": "Paste a website and an agent researches the brand behind it: it opens the site with a browser, searches the web for what the site leaves out, and writes cited notes. An extractor turns the notes into a brand name, audience, voice, description and tagline that a brand kit can use. The researcher uses browser and web search tools. Pick a language model for the researcher and the extractor.",
9
+ "tags": [
10
+ "brand-asset",
11
+ "branding",
12
+ "research",
13
+ "agents",
14
+ "example"
15
+ ],
16
+ "thumbnail": null,
17
+ "thumbnail_url": null,
18
+ "graph": {
19
+ "nodes": [
20
+ {
21
+ "id": "comment",
22
+ "type": "nodetool.workflows.base_node.Comment",
23
+ "data": {
24
+ "comment": "# 🔎 Research a Brand from Its Website\n\nPaste a website and get research notes plus the five fields a brand kit needs: name, audience, voice, one-line description and tagline. Use it to start a brand kit from a site you do not know well.\n\n**How it works:** \"Website\" fills the \"Research brief\" prompt. \"Research agent (browser + web search)\" runs with the browser and web_search tools, capped at 12 turns and $1.00. It opens the site, searches for what the site leaves out, and writes notes with sources that go to \"Research notes\". \"Brand profile fields\", an Extractor, reads the notes and fills \"Brand name\", \"Audience\", \"Voice\", \"Brand description\" and \"Tagline\", leaving a field empty when the notes mark it unconfirmed. Each model step uses your default language model, or the one you pick on the node.\n\n**Try this:** Point \"Website\" at your own site, then edit any field before you generate assets from it."
25
+ },
26
+ "ui_properties": {
27
+ "position": {
28
+ "x": 0,
29
+ "y": 0
30
+ },
31
+ "zIndex": 0,
32
+ "width": 560,
33
+ "selectable": true,
34
+ "bypassed": false,
35
+ "height": 403
36
+ },
37
+ "dynamic_properties": {},
38
+ "dynamic_outputs": {}
39
+ },
40
+ {
41
+ "id": "in_website",
42
+ "type": "nodetool.input.StringInput",
43
+ "data": {
44
+ "name": "website",
45
+ "value": "https://nodetool.ai",
46
+ "description": "The brand's website. The agent starts here."
47
+ },
48
+ "ui_properties": {
49
+ "position": {
50
+ "x": 0,
51
+ "y": 1014
52
+ },
53
+ "zIndex": 0,
54
+ "width": 300,
55
+ "title": "1️⃣ Website",
56
+ "selectable": true,
57
+ "bypassed": false
58
+ },
59
+ "dynamic_properties": {},
60
+ "dynamic_outputs": {}
61
+ },
62
+ {
63
+ "id": "research_prompt",
64
+ "type": "nodetool.text.Prompt",
65
+ "data": {
66
+ "prompt": "Research the brand behind this website: {{ WEBSITE }}\n\n1. Open the website with the browser tool. Open one or two more pages from it if the home page is thin, such as About or Pricing.\n2. Use web search once or twice for what the site does not say: who uses the product and how others describe the brand.\n3. Write research notes in Markdown with these sections:\n\n## Brand\nThe brand name exactly as the site writes it, and what it sells, in one or two sentences.\n\n## Audience\nWho it is for, as specifically as the evidence allows.\n\n## Voice\nThree adjectives for the tone of the site's copy, each with a short quote from the site that shows it.\n\n## Tagline\nThe site's own tagline or headline if it has one. Otherwise propose one of at most six words and say it is proposed.\n\n## Colors\nThe main brand colors you saw, as hex codes if the page exposes them.\n\n## Sources\nEvery URL you used.\n\nUse at most eight tool calls in total, then write the notes. If a page refuses to load, say so and move on. Write \"Not confirmed\" for anything you could not find. Do not invent facts."
67
+ },
68
+ "ui_properties": {
69
+ "position": {
70
+ "x": 400,
71
+ "y": 898
72
+ },
73
+ "zIndex": 0,
74
+ "width": 320,
75
+ "title": "Research brief",
76
+ "selectable": true,
77
+ "bypassed": false,
78
+ "height": 360
79
+ },
80
+ "dynamic_properties": {
81
+ "WEBSITE": ""
82
+ },
83
+ "dynamic_outputs": {}
84
+ },
85
+ {
86
+ "id": "research_agent",
87
+ "type": "nodetool.agents.Agent",
88
+ "data": {
89
+ "model": {
90
+ "type": "language_model",
91
+ "provider": "",
92
+ "id": "",
93
+ "name": "",
94
+ "path": null,
95
+ "supported_tasks": []
96
+ },
97
+ "system": "You are a brand strategist doing desk research. You open pages and search before you write, quote the brand's own words where you can, and say plainly when something is not confirmed.",
98
+ "tools": [
99
+ {
100
+ "type": "tool_name",
101
+ "name": "browser"
102
+ },
103
+ {
104
+ "type": "tool_name",
105
+ "name": "web_search"
106
+ }
107
+ ],
108
+ "image": {
109
+ "type": "image",
110
+ "uri": "",
111
+ "asset_id": null,
112
+ "data": null,
113
+ "metadata": null
114
+ },
115
+ "audio": {
116
+ "type": "audio",
117
+ "uri": "",
118
+ "asset_id": null,
119
+ "data": null,
120
+ "metadata": null
121
+ },
122
+ "history": [],
123
+ "thread_id": null,
124
+ "max_tokens": 8000,
125
+ "max_turns": 12,
126
+ "cost_cap_usd": 1.0,
127
+ "timeout_s": 300
128
+ },
129
+ "ui_properties": {
130
+ "position": {
131
+ "x": 820,
132
+ "y": 870
133
+ },
134
+ "zIndex": 0,
135
+ "width": 340,
136
+ "title": "🔎 Research agent (browser + web search)",
137
+ "selectable": true,
138
+ "bypassed": false,
139
+ "height": 340
140
+ },
141
+ "dynamic_properties": {},
142
+ "dynamic_outputs": {}
143
+ },
144
+ {
145
+ "id": "extract_fields",
146
+ "type": "nodetool.agents.Extractor",
147
+ "data": {
148
+ "model": {
149
+ "type": "language_model",
150
+ "provider": "",
151
+ "id": "",
152
+ "name": "",
153
+ "path": null,
154
+ "supported_tasks": []
155
+ },
156
+ "system_prompt": "Extract a brand profile from the research notes in <TEXT>.\n- brand_name: the brand name exactly as written in the notes.\n- audience: who the brand is for, one sentence.\n- voice: the tone of voice as three adjectives and a short instruction, one sentence.\n- brand_description: what the brand is and how it should feel, one sentence.\n- tagline: the brand's own tagline, or the proposed one when the notes give no confirmed tagline, at most eight words.\nUse only the notes. Leave any other field empty when the notes say it is not confirmed.",
157
+ "text": "",
158
+ "image": {
159
+ "type": "image",
160
+ "uri": "",
161
+ "asset_id": null,
162
+ "data": null,
163
+ "metadata": null
164
+ },
165
+ "audio": {
166
+ "type": "audio",
167
+ "uri": "",
168
+ "asset_id": null,
169
+ "data": null,
170
+ "metadata": null
171
+ },
172
+ "max_tokens": 1024
173
+ },
174
+ "ui_properties": {
175
+ "position": {
176
+ "x": 1260,
177
+ "y": 802
178
+ },
179
+ "zIndex": 0,
180
+ "width": 320,
181
+ "title": "Brand profile fields",
182
+ "selectable": true,
183
+ "bypassed": false
184
+ },
185
+ "dynamic_properties": {},
186
+ "dynamic_outputs": {
187
+ "brand_name": {
188
+ "type": "str",
189
+ "type_args": [],
190
+ "optional": false
191
+ },
192
+ "audience": {
193
+ "type": "str",
194
+ "type_args": [],
195
+ "optional": false
196
+ },
197
+ "voice": {
198
+ "type": "str",
199
+ "type_args": [],
200
+ "optional": false
201
+ },
202
+ "brand_description": {
203
+ "type": "str",
204
+ "type_args": [],
205
+ "optional": false
206
+ },
207
+ "tagline": {
208
+ "type": "str",
209
+ "type_args": [],
210
+ "optional": false
211
+ }
212
+ }
213
+ },
214
+ {
215
+ "id": "out_notes",
216
+ "type": "nodetool.output.Output",
217
+ "data": {
218
+ "name": "research_notes"
219
+ },
220
+ "ui_properties": {
221
+ "position": {
222
+ "x": 1260,
223
+ "y": 1091
224
+ },
225
+ "zIndex": 0,
226
+ "width": 300,
227
+ "title": "Research notes",
228
+ "selectable": true,
229
+ "bypassed": false
230
+ },
231
+ "dynamic_properties": {},
232
+ "dynamic_outputs": {}
233
+ },
234
+ {
235
+ "id": "out_brand_name",
236
+ "type": "nodetool.output.Output",
237
+ "data": {
238
+ "name": "brand_name"
239
+ },
240
+ "ui_properties": {
241
+ "position": {
242
+ "x": 1680,
243
+ "y": 483
244
+ },
245
+ "zIndex": 0,
246
+ "width": 280,
247
+ "title": "Brand name",
248
+ "selectable": true,
249
+ "bypassed": false
250
+ },
251
+ "dynamic_properties": {},
252
+ "dynamic_outputs": {}
253
+ },
254
+ {
255
+ "id": "out_audience",
256
+ "type": "nodetool.output.Output",
257
+ "data": {
258
+ "name": "audience"
259
+ },
260
+ "ui_properties": {
261
+ "position": {
262
+ "x": 1680,
263
+ "y": 683
264
+ },
265
+ "zIndex": 0,
266
+ "width": 280,
267
+ "title": "Audience",
268
+ "selectable": true,
269
+ "bypassed": false
270
+ },
271
+ "dynamic_properties": {},
272
+ "dynamic_outputs": {}
273
+ },
274
+ {
275
+ "id": "out_voice",
276
+ "type": "nodetool.output.Output",
277
+ "data": {
278
+ "name": "voice"
279
+ },
280
+ "ui_properties": {
281
+ "position": {
282
+ "x": 1680,
283
+ "y": 883
284
+ },
285
+ "zIndex": 0,
286
+ "width": 280,
287
+ "title": "Voice",
288
+ "selectable": true,
289
+ "bypassed": false
290
+ },
291
+ "dynamic_properties": {},
292
+ "dynamic_outputs": {}
293
+ },
294
+ {
295
+ "id": "out_brand_description",
296
+ "type": "nodetool.output.Output",
297
+ "data": {
298
+ "name": "brand_description"
299
+ },
300
+ "ui_properties": {
301
+ "position": {
302
+ "x": 1680,
303
+ "y": 1083
304
+ },
305
+ "zIndex": 0,
306
+ "width": 280,
307
+ "title": "Brand description",
308
+ "selectable": true,
309
+ "bypassed": false
310
+ },
311
+ "dynamic_properties": {},
312
+ "dynamic_outputs": {}
313
+ },
314
+ {
315
+ "id": "out_tagline",
316
+ "type": "nodetool.output.Output",
317
+ "data": {
318
+ "name": "tagline"
319
+ },
320
+ "ui_properties": {
321
+ "position": {
322
+ "x": 1680,
323
+ "y": 1283
324
+ },
325
+ "zIndex": 0,
326
+ "width": 280,
327
+ "title": "Tagline",
328
+ "selectable": true,
329
+ "bypassed": false
330
+ },
331
+ "dynamic_properties": {},
332
+ "dynamic_outputs": {}
333
+ }
334
+ ],
335
+ "edges": [
336
+ {
337
+ "id": "e1",
338
+ "source": "in_website",
339
+ "sourceHandle": "output",
340
+ "target": "research_prompt",
341
+ "targetHandle": "WEBSITE",
342
+ "ui_properties": {
343
+ "className": "str"
344
+ },
345
+ "edge_type": "data"
346
+ },
347
+ {
348
+ "id": "e2",
349
+ "source": "research_prompt",
350
+ "sourceHandle": "output",
351
+ "target": "research_agent",
352
+ "targetHandle": "prompt",
353
+ "ui_properties": {
354
+ "className": "str"
355
+ },
356
+ "edge_type": "data"
357
+ },
358
+ {
359
+ "id": "e3",
360
+ "source": "research_agent",
361
+ "sourceHandle": "text",
362
+ "target": "extract_fields",
363
+ "targetHandle": "text",
364
+ "ui_properties": {
365
+ "className": "str"
366
+ },
367
+ "edge_type": "data"
368
+ },
369
+ {
370
+ "id": "e4",
371
+ "source": "research_agent",
372
+ "sourceHandle": "text",
373
+ "target": "out_notes",
374
+ "targetHandle": "value",
375
+ "ui_properties": {
376
+ "className": "str"
377
+ },
378
+ "edge_type": "data"
379
+ },
380
+ {
381
+ "id": "e5",
382
+ "source": "extract_fields",
383
+ "sourceHandle": "brand_name",
384
+ "target": "out_brand_name",
385
+ "targetHandle": "value",
386
+ "ui_properties": {
387
+ "className": "str"
388
+ },
389
+ "edge_type": "data"
390
+ },
391
+ {
392
+ "id": "e6",
393
+ "source": "extract_fields",
394
+ "sourceHandle": "audience",
395
+ "target": "out_audience",
396
+ "targetHandle": "value",
397
+ "ui_properties": {
398
+ "className": "str"
399
+ },
400
+ "edge_type": "data"
401
+ },
402
+ {
403
+ "id": "e7",
404
+ "source": "extract_fields",
405
+ "sourceHandle": "voice",
406
+ "target": "out_voice",
407
+ "targetHandle": "value",
408
+ "ui_properties": {
409
+ "className": "str"
410
+ },
411
+ "edge_type": "data"
412
+ },
413
+ {
414
+ "id": "e8",
415
+ "source": "extract_fields",
416
+ "sourceHandle": "brand_description",
417
+ "target": "out_brand_description",
418
+ "targetHandle": "value",
419
+ "ui_properties": {
420
+ "className": "str"
421
+ },
422
+ "edge_type": "data"
423
+ },
424
+ {
425
+ "id": "e9",
426
+ "source": "extract_fields",
427
+ "sourceHandle": "tagline",
428
+ "target": "out_tagline",
429
+ "targetHandle": "value",
430
+ "ui_properties": {
431
+ "className": "str"
432
+ },
433
+ "edge_type": "data"
434
+ }
435
+ ]
436
+ },
437
+ "input_schema": null,
438
+ "output_schema": null,
439
+ "settings": {},
440
+ "package_name": "nodetool-base",
441
+ "path": null,
442
+ "run_mode": "workflow",
443
+ "required_providers": null,
444
+ "required_models": null
445
+ }