Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
072a8d1
feat(ghlistcategories): added new includeSubcategories boolean parameter
marc-romu Jul 25, 2025
e6ee012
feat(ghlistcomponents): added new nameFilter includeDetails and maxRe…
marc-romu Jul 25, 2025
e23c4a0
fix(ghput): overlapping components when pivot was not provided
marc-romu Jul 25, 2025
9f3ce09
feat(ghjsonanalyzer): added component existence and connection type v…
marc-romu Jul 26, 2025
578e883
refacto(put): commented out ReplaceIntegerIdsInGhJson since fixJSON: …
marc-romu Jul 26, 2025
adf0a7e
refactor(ghjsonanalyzer): moved local checks to core-grasshopper
marc-romu Jul 26, 2025
4f6b09a
fix(openai): tool filter not properly applied
marc-romu Jul 26, 2025
d4d5290
refactor(gh_genetare): ai orchestration approach
marc-romu Jul 25, 2025
6a2a966
refactor: code style
marc-romu Jul 26, 2025
26a0737
docs: update version badge for dev
actions-user Jul 26, 2025
68db75d
feat(ai): add image generation support
marc-romu Jul 26, 2025
ebfacd3
feat(imggenerate): new image generate component
marc-romu Jul 26, 2025
be3baaf
docs: update version badge for dev to 0.5.0-dev.250726 (#279)
marc-romu Jul 26, 2025
213504c
fix(imggenerate): fix inconsistencies
marc-romu Jul 26, 2025
c07a36d
ci(windsurf): limit branch name to 3 words
marc-romu Jul 27, 2025
504cf19
feat(aiprovider): added abiliy to set settings and added promt cache …
marc-romu Jul 27, 2025
82ddf02
refactor(openai): code cleanup
marc-romu Jul 27, 2025
4c2f5f6
refactor(openai): remove prompt caching
marc-romu Jul 27, 2025
2c74081
ci(labels): added image generate label on github
marc-romu Jul 27, 2025
362d110
Update src/SmartHopper.Providers.OpenAI/OpenAIProvider.cs
marc-romu Jul 27, 2025
6f66587
Update src/SmartHopper.Providers.OpenAI/OpenAIProvider.cs
marc-romu Jul 27, 2025
1930bc9
Update src/SmartHopper.Providers.OpenAI/OpenAIProvider.cs
marc-romu Jul 27, 2025
d4f7c62
Update src/SmartHopper.Infrastructure/Managers/AIProviders/AIProvider.cs
marc-romu Jul 27, 2025
3358d2d
refactor(imggenerate): added proper guid
marc-romu Jul 27, 2025
c2dded0
Merge branch 'feature/0.5.0-image-support-ai-providers' of https://gi…
marc-romu Jul 27, 2025
48774f5
refactor: remove trailing spaces
marc-romu Jul 27, 2025
32e5b51
feat(ai): add image generation support and other provider enhancement…
marc-romu Jul 27, 2025
4ae4e55
docs: update version badge for dev
actions-user Jul 27, 2025
d8578b7
docs: update version badge for dev to 0.5.0-dev.250727 (#281)
marc-romu Jul 27, 2025
b852984
feat(providers): new model capability system
marc-romu Jul 27, 2025
388f8be
fix(providers): small build fixes
marc-romu Jul 27, 2025
a6bfc3d
feat(providermodels): new model capabilities system per provider
marc-romu Jul 28, 2025
e9d19fb
feat(modelsmanager): centralizes and simplifies modelmanager
marc-romu Jul 28, 2025
a32f284
fix: missing references
marc-romu Jul 28, 2025
2fa7877
fix(modelsmanager)
marc-romu Jul 28, 2025
da670f4
refactor: missing call to provider initializer
marc-romu Jul 28, 2025
d019507
refactor(model-capabilities): simplify AIModelCapabilities and provid…
marc-romu Jul 28, 2025
4afc6a9
fix(mistralai): model loading was causing resource exhaustion
marc-romu Jul 28, 2025
40edd6a
refactor(aitools): specified model requirements for all ai tools
marc-romu Jul 28, 2025
d229d81
fix(aitools): missing references
marc-romu Jul 28, 2025
29810b4
fix(aiproviders)
marc-romu Jul 28, 2025
520fdab
refactor(components): remark in cas the model was not found
marc-romu Jul 28, 2025
b24cbb8
refactor(openai): added models
marc-romu Jul 28, 2025
12697a3
docs
marc-romu Jul 28, 2025
5ccdc08
fix: codestyle
marc-romu Jul 28, 2025
9329ccd
fix
marc-romu Jul 28, 2025
577a8c6
feat(providers): centralized model capability management and provider…
marc-romu Jul 28, 2025
e564a17
chore: update development version date to 0.5.0-dev.250728
actions-user Jul 28, 2025
64c06d9
chore: update development version date to 0.5.0-dev.250728 (#283)
marc-romu Jul 28, 2025
114d394
feat(aiprovider): moved default model management to model manager
marc-romu Jul 29, 2025
e4d4d90
feat(components): ai components will try the default model before fai…
marc-romu Jul 29, 2025
b04005e
refactor: improvements and fixes in default behaviour
marc-romu Jul 29, 2025
a39b30f
refactor(modelmanager): simplified capability definition to always us…
marc-romu Jul 29, 2025
9aa1aca
feat: enhanced default model (#284)
marc-romu Jul 29, 2025
52b0463
refactor: improved prompts for list generation
marc-romu Jul 29, 2025
4881721
fix(listgenerate): handle case when special characters are in the output
marc-romu Jul 29, 2025
2092be8
fix: scaping {}
marc-romu Jul 29, 2025
974c029
fix(openai): o series models not being set the reasoning effort and t…
marc-romu Jul 29, 2025
544ebb3
fix(parsingtools): possible incorrect formatting with scaped quotes
marc-romu Jul 29, 2025
d4e0c99
fix(core): robust JSON list parsing for AI-generated outputs with arb…
marc-romu Jul 29, 2025
3332b8b
feat(imgviewer): new image viewer component
marc-romu Jul 29, 2025
5906fc4
fix(imgviewer): problems with inputs and outputs
marc-romu Jul 29, 2025
e6a9c48
feat(img): added icons for img generate and img viewer
marc-romu Jul 29, 2025
c3d5d76
ci: manifest description
marc-romu Jul 29, 2025
7286db1
feat(component): add ImageViewerComponent for visualizing and saving …
marc-romu Jul 29, 2025
80d61c0
docs
marc-romu Jul 29, 2025
522f947
chore: prepare release 0.5.0-alpha with version update and code style…
actions-user Jul 29, 2025
8beb4e7
chore: prepare release 0.5.0-alpha with version update and code style…
marc-romu Jul 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/labels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
- name: "component: AI TextListGenerate"
color: "000"
description: "Issues related to the AI Text List Generate component"
- name: "component: AI ImgGenerate"
color: "000"
description: "Issues related to the AI Image Generate component"
- name: "component: AI ScriptReview"
color: "000"
description: "Issues related to the AI Script Review component"
Expand Down Expand Up @@ -113,6 +116,9 @@
- name: "component: LoadGhJSON"
color: "000"
description: "Issues related to the Load GhJSON file component"
- name: "component: ImageViewer"
color: "000"
description: "Issues related to the Image Viewer component"

# Provider Labels
- name: "provider: MistralAI"
Expand Down
2 changes: 1 addition & 1 deletion .windsurf/workflows/new-branch.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Use the following pattern for branch names:
Where:
- `prefix`: Type of change (see available prefixes below)
- `X.Y.Z`: Target version for the changes
- `descriptive-title`: 1-4 words describing the branch purpose (kebab-case)
- `descriptive-title`: 1-3 words describing the branch purpose (kebab-case)

### Available Prefixes

Expand Down
42 changes: 42 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.5.0-alpha] - 2025-07-29

### Added

- **Model Capability Management System**
- Introduced `AIModelCapabilities` and `AIModelCapabilityRegistry` for centralized, persistent model capability tracking.
- Added capability checking and filtering methods for models (e.g., `GetCapabilities`, `SetCapabilities`, `FindModelsWithCapabilities`).
- Tool-specific capability validation now prevents execution with incompatible models.
- Default model is now managed by the `AIModelCapabilityRegistry`. Multiple models can be defined as Default for a set of capabilities.
- `AIStatefulAsyncComponentBase` will now try to use the default model if the specified model is not compatible with the tool.
- **Provider-Specific Capability Management**
- MistralAI:
- Added `MistralModelManager` for dynamic API-based capability detection and registration.
- Models now update their capabilities by querying the `/v1/models/{model_id}` endpoint.
- Automatic mapping of Mistral model features (chat, function calling, vision) to internal capability flags.
- OpenAI & DeepSeek:
- Static mapping for capabilities, with support for function calling, structured output, and image generation.
- **Image Generation Support**: Comprehensive AI image generation capabilities using OpenAI DALL-E models.
- New `DefaultImgModel` property in `IAIProvider` interface for provider capability detection.
- New `img_generate` AI tool with support for prompt, size, quality, and style parameters.
- Enhanced `AIUtils.GenerateImage()` method with provider-agnostic image generation.
- New `AIImgGenerateComponent` UI component in SmartHopper > Img category.
- Improvements in `AITools`:
- New `includeSubcategories` parameter to `gh_list_categories` tool.
- New `nameFilter`, `includeDetails` and `maxResults` parameters to `gh_list_components` tool.
- New `ImageViewer` component to visualize output images on canvas and save them to disk.
- Added component existence and connection type validation to `GHJsonLocal`.
- **Settings management in AI Providers**:
- New `SetSetting` method in `AIProvider` that let's providers set custom settings within the provider key.
- New `RefreshCachedSettings` method in `AIProvider` to refresh their cached settings.

### Changed

- Renamed `AIProvider.InitializeSettgins` to `AIProvider.ResetCachedSettings`. Set visibility to `private`.

### Fixed

- `gh_put` now automatically fixes GhJSON.
- OpenAI tool filter not being applied properly.
- Fixed "Parsing error when output contains { }" ([#276](https://github.com/architects-toolkit/SmartHopper/issues/276)).

## [0.4.1-alpha] - 2025-07-23

### Added
Expand Down Expand Up @@ -53,6 +94,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed certificate creation tests to handle CI environment constraints
- Updated `GhRetrieveComponents` to use the correct ai tool `gh_list_components` instead of `gh_get_available_components`
- Fixes "Missing required parameter: ‘response_format.json_schema' in text-list-generate with OpenAI provider" ([#259](https://github.com/architects-toolkit/SmartHopper/issues/259)).
- Fixes "Check structured output compatibility with models" ([#273](https://github.com/architects-toolkit/SmartHopper/issues/273)).

## [0.3.6-alpha] - 2025-07-20

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# SmartHopper - AI-Powered Grasshopper3D Plugin

[![Version](https://img.shields.io/badge/version-0%2E4%2E1--alpha-orange)](https://github.com/architects-toolkit/SmartHopper/releases)
[![Version](https://img.shields.io/badge/version-0%2E5%2E0--alpha-orange)](https://github.com/architects-toolkit/SmartHopper/releases)
[![Status](https://img.shields.io/badge/status-Alpha-orange)](https://github.com/architects-toolkit/SmartHopper/releases)
[![Test results](https://img.shields.io/github/actions/workflow/status/architects-toolkit/SmartHopper/.github/workflows/ci-dotnet-tests.yml?label=.NET%20CI&logo=dotnet)](https://github.com/architects-toolkit/SmartHopper/actions/workflows/ci-dotnet-tests.yml)
[![Grasshopper](https://img.shields.io/badge/plugin_for-Grasshopper3D-darkgreen?logo=rhinoceros)](https://www.rhino3d.com/)
Expand Down Expand Up @@ -71,6 +71,7 @@ After installation, all SmartHopper components will be available in the Grasshop
| AI Text Evaluate (AiTextEvaluate)<br><sub>Return a boolean from a text content using AI-powered checks</sub> | ⚪ | 🟡 | 🟠 | 🟢 |
| AI Text Generate (AiTextGenerate)<br><sub>Generate text content using AI</sub> | ⚪ | 🟡 | 🟠 | 🟢 |
| AI Text List Generate (AiTextListGenerate)<br><sub>Generate lists of text content using AI</sub> | ⚪ | 🟡 | 🟠 | 🟢 |
| AI Image Generate (AiImageGenerate)<br><sub>Generate images using AI</sub> | ⚪ | 🟡 | 🟠 | 🟢 |
| AI Script Review (AiScriptReview)<br><sub>Make a review of a script, using AI</sub> | ⚪ | - | - | - |
| AI Script Edit (AiScriptEdit)<br><sub>Modify an existing script using AI</sub> | ⚪ | - | - | - |
| AI Script New (AiScriptNew)<br><sub>Generate a script using AI</sub> | ⚪ | - | - | - |
Expand All @@ -96,6 +97,7 @@ AI Tools are the interface between AI and Grasshopper, allowing to, for example,
|-----------|-------------|:-------:|:-----------:|:-------:|:-----------:|
| text_evaluate | Evaluates text against a true/false question | ⚪ | 🟡 | 🟠 | 🟢 |
| text_generate | Generates text based on a prompt and optional instructions | ⚪ | 🟡 | 🟠 | 🟢 |
| img_generate | Generates an image based on a prompt and optional instructions | ⚪ | 🟡 | 🟠 | 🟢 |
| list_evaluate | Evaluates a list based on a natural language question | ⚪ | 🟡 | 🟠 | 🟢 |
| list_filter | Filters a list based on natural language criteria | ⚪ | 🟡 | 🟠 | 🟢 |
| list_generate | Generates a list based on a natural language prompt | ⚪ | 🟡 | 🟠 | 🟢 |
Expand Down
2 changes: 1 addition & 1 deletion Solution.props
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<SolutionVersion>0.4.1-alpha</SolutionVersion>
<SolutionVersion>0.5.0-alpha</SolutionVersion>
</PropertyGroup>
</Project>
4 changes: 2 additions & 2 deletions src/SmartHopper.Components/AI/AIChatComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,8 @@ public override async System.Threading.Tasks.Task DoWorkAsync(CancellationToken
this.progressReporter?.Invoke("Starting web chat interface...");

// Get the actual provider name to use
string actualProvider = this.component.GetActualProviderName();
Debug.WriteLine($"[AIChatWorker] Using Provider: {actualProvider} (Selected: {this.component.GetActualProviderName()})");
string actualProvider = this.component.GetActualAIProviderName();
Debug.WriteLine($"[AIChatWorker] Using Provider: {actualProvider} (Selected: {this.component.GetActualAIProviderName()})");

// Create a web chat worker
var chatWorker = WebChatUtils.CreateWebChatWorker(
Expand Down
4 changes: 2 additions & 2 deletions src/SmartHopper.Components/AI/AIModelsComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public override async Task DoWorkAsync(CancellationToken token)
try
{
// Get the current AI provider
var provider = this._parent.GetCurrentAIProvider();
var provider = this._parent.GetActualAIProvider();
if (provider == null)
{
this._result["Success"] = false;
Expand All @@ -136,7 +136,7 @@ public override async Task DoWorkAsync(CancellationToken token)
}

// Retrieve available models
var models = await provider.RetrieveAvailableModels();
var models = await provider.Models.RetrieveAvailable().ConfigureAwait(false);
if (models == null || !models.Any())
{
this._result["Success"] = false;
Expand Down
Loading
Loading