release: v7.14.0 — OCL operators, LLM-configurable BAF agents & No-Code GUI fix - #591
Merged
Merged
Conversation
…r 10 new LLM providers Add LLMMistral, LLMDeepSeek, LLMGoogle, LLMMeta, LLMAnthropic, LLMQwen, LLMxAI, LLMGroq, LLMTogether, and LLMOpenRouter as LLMWrapper subclasses in the agent metamodel, and extend Agent._LLM_PROVIDERS to 14 entries. Update the BAF agent generator template with the corresponding imports, add api_key config stanzas for each new provider, extend the BUML code builder import string, and add all new class-to-provider entries in the agent diagram converter reverse map.
- Updated llmProvider allowed values from 4 entries to all 14 (matching what's now in RECOMMENDATION_ALLOWED_VALUES)
- Added 10 per-provider model name lists (mistralModels, deepseekModels, … openrouterModels)
BESSER core: tests
- test_agent_converter_roundtrip.py: 10 new parametrized cases (test_new_provider_roundtrip_preserves_provider_key[<provider>]) — each creates an Agent, runs it through Agent → code → JSON → Agent, and asserts the correct import class name appears in generated code and the provider key / model name survive the full trip. 11/11 pass.
- test_agent_config_recommendation_utils.py: 20 new parametrized cases — test_normalize_llm_block_keeps_new_providers (LLM block not coerced to {}) and test_new_providers_in_recommendation_allowed_values (allow-list completeness). 45/45 pass.
Resolves the conflicts caused by the Ollama provider (#565) landing on development first. All five conflicts are additive-vs-additive: both sides appended to the same provider structures, so each is resolved as a union. - agent.py: keep LLMOllama, then the 10 new LLMWrapper subclasses; _LLM_PROVIDERS carries all 15 entries. - agent_diagram_converter.py: reverse map carries all 15 class names. - agent_config_recommendation_utils.py: llmProvider allow-list is the union, which keeps the legacy no-underscore 'huggingfaceapi' spelling that development ships alongside this branch's canonical 'huggingface_api'. - agent_personalization.rst: both provider lists plus the Ollama prose. - test_agent_converter_roundtrip.py: keep both new tests.
Review follow-ups on the 10-provider addition.
- agent_config_recommendation_utils.py: document why the no-underscore
"huggingfaceapi" spelling stays in the llmProvider allow-list. The frontend
still emits it from saved configs (local-storage-repository.ts), so dropping
it made normalize_recommended_agent_config() fail its membership check and
return {}, silently discarding the user's saved provider.
- test_agent_converter_roundtrip.py: assert the round-tripped object's concrete
class. The existing assertions only covered `name` and `parameters["model"]`,
both provider-agnostic, so a wrong entry in _direct_llm_class_to_provider
(LLMMistral -> "deepseek") would have passed — the very thing the test's
docstring claims to catch. Mirrors the isinstance() check already used by
test_agent_roundtrip_preserves_ollama_llm_and_embedding.
- generation_router.py: exclude every per-provider "*Models" list from the
recommendation prompt payload instead of only "openaiModels". The hardcoded
pair already leaked ollamaModels and would leak all ten new lists into a flow
that structurally does not recommend a provider or model.
- agent.py: stop hand-enumerating providers in new_llm's docstring; point at
sorted(Agent._LLM_PROVIDERS), which the ValueError below already reports.
feat(agents): extend metamodel and generator for 10 new LLM provider families
updated grammar, wrapping_visitor and tests for the changes
- Replace OSM iframe preview with react-leaflet MapContainer + TileLayer - Add data-source trait (class picker) + latitude-field, longitude-field, marker-label-field selects; geo-field options populate dynamically when a class is chosen - Inject Leaflet CSS into GrapesJS iframe canvas to fix tile/marker rendering - Fix: remove 'map' from removeUnwantedBlocks — our custom block used the same id and was being deleted on every editor load - Add leaflet ^1.9.4, react-leaflet ^4.2.1, @types/leaflet to package.json - Add latitudeField, longitudeField, markerLabelField i18n keys to all 6 locales
New Map view component end-to-end across the BESSER stack. Markers bind to a domain Class with lat/lng attributes and are fetched from the auto-generated REST endpoint. No API key required. - Metamodel: rewrite Map(ViewComponent) with center_lat/lng, zoom, latitude_field, longitude_field, marker_label_field, data_binding; WorldMap/LocationMap kept as thin subclasses - json_to_buml: add parse_map(); re-route type==map away from EmbeddedContent - buml_to_json: add _apply_map_attributes(); add Map/WorldMap/LocationMap to exec() safe_globals - Code builder: add _write_map() for Python codegen round-trips - React generator: new MapBlock.tsx (react-leaflet, OSM tiles, per-row markers); leaflet/react-leaflet added to package.json.j2 - Flutter generator: FlutterMap widget on main screen; flutter_map + latlong2 added to pubspec.yaml.j2 - Docs: gui.rst Map Component section; react.rst MapBlock; flutter.rst FlutterMap - Tests: 20 new tests (metamodel, converter round-trip, code builder, React generator, Flutter generator) - Submodule: bump frontend pointer to feat/maps_webapp_component
Replace the single-binding flat-field Map with a layers list. Each MapLayer declares a type (points / geojson / choropleth / heatmap), binds its own domain class, and carries typed field references with auto-detection when layer_type is omitted. Metamodel (besser/BUML/metamodel/gui/dashboard.py) - Add MapLayerType enum (points, geojson, choropleth, heatmap) - Add MapLayer(NamedElement) with field-ref setters and effective_layer_type() auto-detection - Rewrite Map.__init__ to accept layers: List[MapLayer]; remove flat latitude_field / longitude_field / marker_label_field Converters - json_to_buml: rewrite parse_map to parse map-layers JSON attribute into MapLayer list, resolving class/field UUIDs with name fallback - buml_to_json: rewrite _apply_map_attributes to serialise layers list; add MapLayer/MapLayerType to exec sandbox safe_globals; add missing builtins (next, hasattr, getattr, isinstance) Code builder (besser/utilities/buml_code_builder/gui_model_builder.py) - Add _write_map_layer helper; rewrite _write_map to emit MapLayer list with field lookups via direct domain_model variable reference React generator (besser/generators/react/) - serialization.py: emit node[layers] list per Map component - page_builder.py: pass layers= prop to <MapBlock> - Rebuild MapBlock.tsx template: four labelled layer renderers (PointsLayer, GeoJsonLayer, ChoroplethLayer, HeatLayer), graceful degradation, choropleth legend, custom-icon extension block - package.json.j2: add leaflet.heat ^0.2.0 + @types/leaflet.heat ^0.2.4 Docs - Add docs/source/generators/maps.rst (layer contracts, auto-detection rules, worked example, extending guide) - Update gui.rst Map section with MapLayer/MapLayerType reference - Update react.rst dependency table; add maps to generators.rst toctree Tests - Add tests/BUML/metamodel/gui/test_map_layer.py (22 tests) - Add tests/utilities/.../test_map_converter_roundtrip.py (12 tests) - Update tests/generators/react/test_react_generator.py — MapLayer fixture, leaflet.heat assertion - Update tests/BUML/metamodel/gui/test_gui.py — migrate 5 stale flat-field Map tests to the new layers API
…de GUI fix - Bump setup.cfg 7.13.0 -> 7.14.0 and add v7.14.0 release notes. - Frontend submodule bump to 67efe863: agent LLM-configuration UI (#162), fix for OCL/non-association links leaking into autogenerated No-Code tables (#186), and the npm lockfile repair (#178). - Backend content since v7.13.0 (already on development): OCL grammar extensions asSet/intersection/isUnique/dot-allInstances (#585) and BAF agent LLM support (#575).
…und-trip - .gitmodules: restore upstream frontend submodule URL/branch; reset the submodule pointer to the development one (frontend changes land via the frontend PR). - MapBlock.tsx: rewrite on plain leaflet (react-leaflet is Hippocratic-2.1 licensed); popup labels and legend titles are now HTML-escaped, marker icons are an inline SVG (no unpkg CDN), heat layers no longer stack on re-fetch, and centre/zoom prop changes move the map after mount. - package.json.j2 + react.py: leaflet deps and MapBlock.tsx only ship when the GUI model contains a Map component; react-leaflet removed. - gui_model_builder: resolve domain_model via globals().get() again (bare reference raised NameError for chart/table exports without a domain model); emit concrete Map subclass names, layer styling, created_vars. - dashboard.py: Map() params are keyword-only with real defaults (0.0/0.0/10) and a deprecated no-op data kwarg so pre-7.14 callers fail loudly or keep working instead of silently binding rows to title; layer_type raises ValueError like other enum setters; drop getattr/except-pass guards. - gui_diagram_converter: map-layers is assigned unconditionally (setdefault resurrected deleted layers; empty list now representable as []). - chart_parsers: replace blanket per-layer except with an isinstance guard. - flutter: OSM attribution widget, drop unused http/dart:convert imports and http pubspec dep; docs no longer claim data-bound markers (React-only for now — the FlutterGenerator criterion of #479 stays open). - docs/tests updated accordingly; pubspec test no longer rmtree's a real cwd/output directory.
…erged into master)
feat(gui): multi-layer Map component (sync to development)
- Release notes: add the Map component highlight (metamodel + No-Code editor + React generator, contributed by Prasad Adhav) and extend the frontend-submodule summary. - Frontend submodule bump to c6d0e860: Map block + layer-manager trait with bundled Leaflet assets.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
->asSet(),->intersection(...),->isUnique(...)and the standard dot formType.allInstances()alongside the existingType::allInstances()(both produce the same AST, so saved constraints keep parsing), with wrapping-visitor support and a dedicated parser test suite (updated grammar, wrapping_visitor and tests for the changes #585).huggingfaceapikey still accepted (feat(agents): extend metamodel and generator for 10 new LLM provider families #575).Test plan
python -m pytest tests/BUML/notations/ocl— new OCL constructs parse, bothallInstances()forms agreepython -m pytest tests/utilities/web_modeling_editor— agent converter round-trip incl. LLM configcd docs && make html— v7.14.0 page renders