Skip to content

release: v7.14.0 — OCL operators, LLM-configurable BAF agents & No-Code GUI fix - #591

Merged
ArmenSl merged 18 commits into
masterfrom
development
Sep 8, 2026
Merged

ArmenSl merged 18 commits into
masterfrom
development

Conversation

@ArmenSl

@ArmenSl ArmenSl commented Sep 8, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Test plan

  • python -m pytest tests/BUML/notations/ocl — new OCL constructs parse, both allInstances() forms agree
  • python -m pytest tests/utilities/web_modeling_editor — agent converter round-trip incl. LLM config
  • Full docs build: cd docs && make html — v7.14.0 page renders
  • Editor smoke: hotel-booking benchmark model -> autogenerate GUI -> Guest/Employee tables have no OCL column

prasadadhav and others added 16 commits July 16, 2026 16:38
…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.
ArmenSl and others added 2 commits September 8, 2026 11:22
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.
@ArmenSl
ArmenSl merged commit 27cf08a into master Sep 8, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants