SmartHopper - A deeply integrated AI assistant for Grasshopper

Thanks for reporting!

Absolutely, brackets { } are breaking the internal JSON format, so the output is wrong. I’ll have to handle this case. → Link to issue

This might be because each model has a different maximum length for the returned value. In long lists you might be getting to the limit, so the list is not as long as expected. I’ll think about if it is possible to automatically ask the AI for more results until the “count” is reached. → Link to issue

Also, AI Text List Generate is designed to return text. Since you were asking for points, Grasshopper is automatically converting text to points. I’m planning to add more components like AI Point List Generate, AI Number List Generate, etc. to ensure the output is correct. But it requires time :slight_smile:

Thanks for identifying issues!

I have to say this is one of the most fun plugins I’ve ever used!
To have an easy to use integration btw AI and Grasshopper/Rhino 3d design is exciting for me anyway. I downloaded the colors gh (Thanks Dfytz1!) and played with it. Used gpt 4o mini and solved the text to numbers issue in the prompt. Now I’ll move on to building something of my own. Good work! :smiley:

Hi! Take a look at the last release (0.5.0-alpha) with a couple of new features:

  • It includes some new components to generate images using the power of Dall-E from OpenAI.

  • It also fixes the parsing problem that @dfytz1 reported above. Now you can draw McDonald’s arches from a list of points!

I hope you like them!

Image generation is very useful!



Not without errors(was trying to override existing image, worked multiple times but then stopped working:

For image generation seed would be great, but i am not sure openai gives you control over that.
Right now if you want to generate same prompt twice, you need to generate something else first, that is not very convenient.
NoiseSmartHopper_00.gh (2.4 MB)

Overall great component, waiting for future updates!

…on my end it just crashes when I try to open gh :sleepy_face:

Thanks for reporting @lander. There was a bug in the first initialization of the settings file. This bug didn’t affect people who already had SmartHopper installed before. I’m sorry for the trouble. The bug has been fixed in 0.5.2-alpha.

hmm, well I decided to dabble in it again, and actually got it to launch this time. :beers:

so far can’t get it to work.

looks like imma give up again until something gets fixed. got nowhere and wasted $00.41 so far plus tax lol.

There’s got to be an easier way to do this lmao.

Hi @lander thanks for reporting.

I guess the issue is with the new gpt-5 model. It was released 10 days ago and it might have introduced some breaking changes from previous api. 4o-mini and older models were verified and working fine.

I opened this issue on github to track the fix. I hope to patch it soon Gpt-5 api errors · Issue #304 · architects-toolkit/SmartHopper · GitHub

Thanks for testing!

Hi @lander , I checked and confirmed a small incompatibility between gpt-5 and the script_new tool (the one that adds new script components to the canvas). It is now addressed in 0.5.3-alpha (just released).

On models: gpt-5 is very capable but can be resource‑intensive. In my tests, occasional empty responses were likely due to external API rate limiting. As a lighter alternative, gpt-5-mini has been more consistent for me—you might find it performs better in this workflow.

Regarding auto‑connecting components you suggest in the screenshot: that’s a great idea. There isn’t a dedicated tool for this yet, so I’ve added it to the roadmap.

You can already try script_new by asking the chat to create a new script component for a specific purpose. It’s still under development: the overall logic is often good, but inputs/outputs may still need manual tweaks (types, names) and sometimes small code adjustments. Your examples are helpful and will guide improvements.

Thanks again for the feedback. I’ll share an update as the fixes and enhancements land.

SmartHopper 1.0 is here!

Hey everyone!

After 2.5 months of hard work, I’m excited to announce that SmartHopper has reached version 1.0! This update is packed with new features, bug fixes, and stability improvements - all thanks to your feedback that guided me on the way. Thank you all!

Let’s dive in:

Canvas Button

Say hello to the new Canvas Button in the top-left corner of your canvas! Click it to launch SmartHopper Assistant, your AI companion designed to help with Grasshopper tasks. Don’t worry if it’s not your thing—you can hide it in the settings.

Component Badges

Ever wondered if a model is compatible with a component? Now you’ll know before running it, thanks to the new badges. Look out for the special tick badge for verified models: gpt-5-mini from OpenAI and mistral-small-latest from MistralAI. And if you try to use an incompatible model, we’ve got you covered with an automatic replacement.

New Providers

More choices! Alongside MistralAI, OpenAI, and DeepSeek, now we can also use Anthropic and OpenRouter.

Stability & Security

I’ve made lots of under-the-hood improvements to boost stability and security. What might affect you: Your API keys are now encrypted with an individualized key, so your settings file will get a makeover on the first run.

Feedback

Your feedback is invaluable. Share your work with SmartHopper in this forum or on GitHub > Discussions > Show and Tell.

Enjoy the update; I personally do!

I was all set to try it out but it looks like I need to have Rhino 8. True?

Hi @Don_Teeter . Yes, for now SmartHopper is only compatible with Rhino 8.19 or newer. I apologize for the inconvenience.

Hey everyone,

SmartHopper 1.1.0‑alpha is out! It brings three things that should be immediately useful in day‑to‑day work:

  • Better knowledge tools
    • New McNeel forum tools let you search the forum, pull posts by ID, and get AI‑generated summaries of threads directly from Grasshopper.
    • The generic web reader now returns clean text for common sources (Wikipedia, Discourse forums, GitHub/GitLab files, Stack Exchange), so the AI has much better context.

  • Smarter GhJSON
    • When you ask the AI to see components in your canvas (gh_get AI tool), now the format is optimized to focus only on relevant properties. This minimizes token usage and helps AI to get a better answer.
  • Groundwork for richer scripting
    • Coding can be a pain in the ass for non-programmers (that’s why we use Grasshopper, right?). However, Grasshopper comes with some Script components in Python, C#, IronPython and VB, that can be used in an infinite range of ways. This release is setting the base for the next release (1.2), which will ease the link between native Grasshopper Script components and AI.

This release requires Rhino 8.24 or above. If you installed SmartHopper from the package manager, it will automatically update.

Enjoy it!

Hey everyone,

I’ve just released SmartHopper 1.2.0‑alpha, focused on making Grasshopper scripting feel as easy as wiring native components.

Create powerful scripts in seconds. New AI‑assisted scripting tools let you generate, edit, and refine Python/C#/VB/IronPython script components directly from natural language. SmartHopper takes care of parameters, modifiers, and validation so you can focus on what the script should do (not the boilerplate).

I’ve also added a new “Not Recommended” model badge. When the selected model isn’t a good fit for the component, you’ll see an orange warning badge so you can catch sub‑optimal model choices at a glance.

For GhJSON workflows, there’s now a component replacement mode with confirmation dialogs. SmartHopper asks whether to replace or create new components, so you stay in control of changes.

I’ve also refreshed several component icons, and I think the palette is starting to look good now, right? There are already 25 components with endless possibilities!

imatge

If you installed SmartHopper from the Rhino package manager, it should update automatically.
Requires Rhino 8.24 or later.

I’d love to hear how the new scripting flow works for you. Feedback and ideas are very welcome!

Pretty cool! You’ve probably got some experience with IDE agents, right?

I played around for a bit with what you showed in the screenshot and from what I noticed, the AI understands the error returned by the component, but I don’t think it has knowledge of the input values or the values in the output. I even asked it, “How many cylinders did you create?” but instead of answering, it just added output returning the number :slight_smile:

What I mean is… if I have some input and an expected output (e.g. a specific split into tree branches), will the AI be able to perform some sort of “self-reflection” that its proposed solution does produce an output, but one that doesn’t meet the described criteria?

Same goes for automatically fixing errors. That’s exactly how Agents in VS Code work, like Claude Code or Codex - they implement the code, automatically fix errors during implementation, and in the end they even do a plugin build. I’m sure you know what I mean and where I’m going with this.

Hi @moby-dk, thanks for testing the new release so quickly!

I know exactly what you mean :wink: The AIScriptGenerator component already does a self‑validation pass before returning the script, and silently sends it back to the AI if it doesn’t follow the language‑specific rules. However, I think it’s quite hard in the Grasshopper environment to make the whole process fully automatic: generate the script > place the component on the canvas > solve it > send errors and output values back to the AI > improve the script.

That said, it should be doable in the Canvas Assistant Chat with just two or three interactions.

One question: where did you ask “How many cylinders did you create?”, in the AIScriptGenerator component or in the Canvas Assistant Chat?

I asked both. One simply modified the script, while the other didn’t answer this simple question but instead provided a lengthy review of my script.

I’m wondering how this could be encapsulated in a loop; sometimes the debugging part of our script can provide a lot of information about its operation. However, you could also say I’m just outrageously lazy, since I don’t even want to check the results myself or send repeated prompts, but expect it to be done without my intervention.

Hi @moby-dk,

I released version 1.2.1 today with a small fix. The tool was not returning the correct GUID for the new component internally, which is why the Chat Assistant was unable to read the data in that component.

I’ve also added a tool that provides the AI with the data structure and some sample data, which should help save many tokens. I found it a bit unstable with gpt-5-mini (it didn’t know how to call the tool), but I’ll keep working on it. If the assistant doesn’t find the component, try selecting it and asking about the “selected component”… that always helps.

The AIScriptGenerator component will never be able to answer a question like “How many cylinders did you create?” because it only implements the script_generate AI tool, so it doesn’t have access to the required data.

I totally agree, and it would be great to have that. The challenge is that I’m not sure whether it’s possible to trigger the solver (to get both the results and the runtime errors of the script component) without disrupting the current operation of generating the script component itself. We’ll have to think about it…

I was curious about one thing and ran a simple test. It was a bit slow, but OpenAI could be to blame. I also deliberately added 3-second pauses to ensure the script had time to be updated in the Grasshopper and then output written the to disk before the Agent started reading it again. The test ran successfully, and it’s safe to assume that the text output files might reflect the debugging results from our code, the Grasshopper tree structure of our outputs, values, and errors during script changes.

The option to add a script read from disk using the Grasshopper Script Component is somewhat hidden. You need to hold Shift and right-click on the component, and add the “Synchronize” option to the “script” input.

An additional bonus is that the analyzed output doesn’t have to be immediately after the script component; you can simply connect a component and then write the output. However, if we create some complex operations after the script component, the Agent will probably have to work hard to discover what it needs to change in the code to get the expected result - such an approach can be a real waste of energy…

Maybe some things from this approach can be utilized in your plugin.

prompt for the first test:
In the “test2.py” script, we have the constant “y,” and in the “output2.txt” file, we have an expression. Increase the constant “y” by 1 until the “output2.txt” file contains the expression “foka”. After each change in the “test2.py” file, save it and wait 3 seconds to recheck the contents of “output2.txt.” Do not make any changes to the code other than changing the value of the “y” constant.

1. only value changes

2. fix error first and then look for the correct value