From b8f220832f5d25e43c3b0705c33958060a865d46 Mon Sep 17 00:00:00 2001 From: goulven Date: Thu, 2 Jan 2025 12:56:40 +0100 Subject: [PATCH] UI and GenAI --- .../api/controller/api/GenAiController.java | 6 +- .../api/services/PageGenerationService.java | 7 +- ...ataCompletion2ScoreAggregationService.java | 2 +- .../scores/EcoScoreAggregationService.java | 6 +- .../{TopPage.java => AiSourcedPage.java} | 14 +- .../elastic/VerticalPagesRepository.java | 4 +- .../ui/pages/EcoscoreController.java | 16 +- ui/src/main/resources/static/css/custom.css | 83 ++- .../resources/templates/default/index.html | 7 +- .../templates/themes/v2/ecoscore.html | 77 ++- .../templates/themes/v2/inc/header-meta.html | 15 +- .../themes/v2/inc/navbar/navbar-home.html | 20 +- .../resources/templates/themes/v2/index.html | 635 +++++++----------- 13 files changed, 434 insertions(+), 458 deletions(-) rename commons/src/main/java/org/open4goods/commons/model/{TopPage.java => AiSourcedPage.java} (98%) diff --git a/api/src/main/java/org/open4goods/api/controller/api/GenAiController.java b/api/src/main/java/org/open4goods/api/controller/api/GenAiController.java index 1574a6f7f..8cb3fcc13 100644 --- a/api/src/main/java/org/open4goods/api/controller/api/GenAiController.java +++ b/api/src/main/java/org/open4goods/api/controller/api/GenAiController.java @@ -10,7 +10,7 @@ import org.open4goods.commons.exceptions.AggregationSkipException; import org.open4goods.commons.exceptions.InvalidParameterException; import org.open4goods.commons.exceptions.ResourceNotFoundException; -import org.open4goods.commons.model.TopPage; +import org.open4goods.commons.model.AiSourcedPage; import org.open4goods.commons.model.constants.RolesConstants; import org.open4goods.commons.services.VerticalsConfigService; import org.open4goods.commons.services.ai.GenAiService; @@ -66,7 +66,7 @@ public String prompt(@RequestParam(defaultValue = "test") String key, @GetMapping("/page/generate") @Operation(summary="Generate a page") - public TopPage prompt(@RequestParam(defaultValue = "test") String key, + public AiSourcedPage prompt(@RequestParam(defaultValue = "test") String key, String question, String vertical, String id, @@ -75,7 +75,7 @@ public TopPage prompt(@RequestParam(defaultValue = "test") String key, VerticalConfig vc = verticalsConfigService.getConfigById(vertical); - TopPage ret = pageGenService.generatePage(vc, question, id, question, title); + AiSourcedPage ret = pageGenService.generatePage(vc, question, id, question, title); return ret; } diff --git a/api/src/main/java/org/open4goods/api/services/PageGenerationService.java b/api/src/main/java/org/open4goods/api/services/PageGenerationService.java index 851a28967..cd2dfd5df 100644 --- a/api/src/main/java/org/open4goods/api/services/PageGenerationService.java +++ b/api/src/main/java/org/open4goods/api/services/PageGenerationService.java @@ -10,7 +10,7 @@ import org.open4goods.commons.dao.ProductRepository; import org.open4goods.commons.exceptions.ResourceNotFoundException; import org.open4goods.commons.model.AiReview; -import org.open4goods.commons.model.TopPage; +import org.open4goods.commons.model.AiSourcedPage; import org.open4goods.commons.model.product.Product; import org.open4goods.commons.services.VerticalsConfigService; import org.open4goods.commons.services.ai.GenAiService; @@ -51,7 +51,7 @@ public PageGenerationService( GenAiService aiService, VerticalsConfigService ver * @throws ResourceNotFoundException * @throws IOException */ - public TopPage generatePage(VerticalConfig vConf, String question, String id, String language, String title) throws JsonParseException, JsonMappingException, ResourceNotFoundException, IOException { + public AiSourcedPage generatePage(VerticalConfig vConf, String question, String id, String language, String title) throws JsonParseException, JsonMappingException, ResourceNotFoundException, IOException { Map context = new HashMap<>(); @@ -59,13 +59,12 @@ public TopPage generatePage(VerticalConfig vConf, String question, String id, S context.put("VERTICAL_NAME", (vConf.getI18n().get("fr").getVerticalHomeTitle())); context.put("QUESTION", question); - // AI Prompting PromptResponse response = aiService.prompt("perplexity-top-page-generation", context); System.out.println(response.getRaw()); - TopPage page = new TopPage(); + AiSourcedPage page = new AiSourcedPage(); page.setId(id); page.setLanguage(language); page.setQuestion(question); diff --git a/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/DataCompletion2ScoreAggregationService.java b/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/DataCompletion2ScoreAggregationService.java index c26ff0d4f..ea5d3c255 100644 --- a/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/DataCompletion2ScoreAggregationService.java +++ b/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/DataCompletion2ScoreAggregationService.java @@ -48,7 +48,7 @@ public void onProduct(Product data, VerticalConfig vConf) { /** - * The data score is the number of score that are not virtuals + * The data score is the number of scores that are not virtuals * @param map * @return */ diff --git a/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/EcoScoreAggregationService.java b/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/EcoScoreAggregationService.java index d03bcb47a..17249a58a 100644 --- a/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/EcoScoreAggregationService.java +++ b/api/src/main/java/org/open4goods/api/services/aggregation/services/batch/scores/EcoScoreAggregationService.java @@ -56,7 +56,7 @@ public void onProduct(Product data, VerticalConfig vConf) { private Double generateEcoScore(Map scores, VerticalConfig vConf) throws ValidationException { - double va = 0.0; + double ecoscoreVal = 0.0; for (String config : vConf.getImpactScoreConfig().getCriteriasPonderation().keySet()) { Score score = scores.get(config); @@ -66,10 +66,10 @@ private Double generateEcoScore(Map scores, VerticalConfig vConf) // Taking on the relativ - va += score. getRelativ().getValue() * Double.valueOf(vConf.getImpactScoreConfig().getCriteriasPonderation().get(config)); + ecoscoreVal += score. getRelativ().getValue() * Double.valueOf(vConf.getImpactScoreConfig().getCriteriasPonderation().get(config)); } - return va; + return ecoscoreVal; } diff --git a/commons/src/main/java/org/open4goods/commons/model/TopPage.java b/commons/src/main/java/org/open4goods/commons/model/AiSourcedPage.java similarity index 98% rename from commons/src/main/java/org/open4goods/commons/model/TopPage.java rename to commons/src/main/java/org/open4goods/commons/model/AiSourcedPage.java index 02862aeea..1f5badc1f 100644 --- a/commons/src/main/java/org/open4goods/commons/model/TopPage.java +++ b/commons/src/main/java/org/open4goods/commons/model/AiSourcedPage.java @@ -13,7 +13,7 @@ * POJO Content for a page that presents tops, best, .. */ @Document(indexName = "vertical-pages", createIndex = true, writeTypeHint = WriteTypeHint.FALSE) -public class TopPage { +public class AiSourcedPage { @Id @@ -28,17 +28,19 @@ public class TopPage { private String title; /*** - * description of the article + * question this article must answers */ @Field(index = true, store = false, type = FieldType.Text) - private String description; - + private String question; + /*** - * question this article must answers + * description of the article */ @Field(index = true, store = false, type = FieldType.Text) - private String question; + private String description; + + /** Conseils **/ @Field(index = true, store = false, type = FieldType.Text) diff --git a/commons/src/main/java/org/open4goods/commons/store/repository/elastic/VerticalPagesRepository.java b/commons/src/main/java/org/open4goods/commons/store/repository/elastic/VerticalPagesRepository.java index f3457c815..7b90a4f7a 100644 --- a/commons/src/main/java/org/open4goods/commons/store/repository/elastic/VerticalPagesRepository.java +++ b/commons/src/main/java/org/open4goods/commons/store/repository/elastic/VerticalPagesRepository.java @@ -1,8 +1,8 @@ package org.open4goods.commons.store.repository.elastic; -import org.open4goods.commons.model.TopPage; +import org.open4goods.commons.model.AiSourcedPage; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -public interface VerticalPagesRepository extends ElasticsearchRepository { +public interface VerticalPagesRepository extends ElasticsearchRepository { } diff --git a/ui/src/main/java/org/open4goods/ui/controllers/ui/pages/EcoscoreController.java b/ui/src/main/java/org/open4goods/ui/controllers/ui/pages/EcoscoreController.java index fdac3e09b..fff13c70c 100644 --- a/ui/src/main/java/org/open4goods/ui/controllers/ui/pages/EcoscoreController.java +++ b/ui/src/main/java/org/open4goods/ui/controllers/ui/pages/EcoscoreController.java @@ -1,6 +1,7 @@ package org.open4goods.ui.controllers.ui.pages; -import org.open4goods.ui.config.yml.UiConfig; +import org.open4goods.commons.config.yml.ui.VerticalConfig; +import org.open4goods.commons.services.VerticalsConfigService; import org.open4goods.ui.controllers.ui.UiService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,11 +28,10 @@ public class EcoscoreController implements SitemapExposedController{ private static final Logger LOGGER = LoggerFactory.getLogger(EcoscoreController.class); private @Autowired UiService uiService; - // The siteConfig - private final UiConfig config; + private @Autowired VerticalsConfigService verticalsConfigService; + - public EcoscoreController(UiConfig config) { - this.config = config; + public EcoscoreController() { } @@ -46,6 +46,12 @@ public SitemapEntry getExposedUrls() { public ModelAndView api(final HttpServletRequest request) { ModelAndView ret = uiService.defaultModelAndView(("ecoscore"), request); ret.addObject("page","évaluation environnementale"); + + + VerticalConfig verticalConfig = verticalsConfigService.getConfigById("tv"); + ret.addObject("impactscore",verticalConfig .getImpactScoreConfig()); + ret.addObject("verticalConfig",verticalConfig); + return ret; } diff --git a/ui/src/main/resources/static/css/custom.css b/ui/src/main/resources/static/css/custom.css index 986a6bb62..871916599 100644 --- a/ui/src/main/resources/static/css/custom.css +++ b/ui/src/main/resources/static/css/custom.css @@ -34,17 +34,92 @@ CUSTOM Xwiki css **************************************************/ /** Xwiki box **/ -.box { - min-height: 20px; + +.box, .plainmessage, fieldset.xwikimessage { + min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #fafafa; border: 1px solid #e8e8e8; - border-radius: 4px; + border-radius: 7px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); overflow-x: auto; -} +} + +.box blockquote, .plainmessage blockquote, fieldset.xwikimessage blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.box > *:last-child, .box > .xwiki-metadata-container > *:last-child { + margin-bottom: 0; +} + +.plainmessage { + background-repeat: no-repeat; +} + +.successmessage { + color: #3c763d; + background-color: #e5f3df; + border-color: #dbeccc; + border-color: #077537; +} + +.successmessage hr { + border-top-color: #cee5ba; +} + +.successmessage .alert-link { + color: #2b542c; +} + +.errormessage { + color: #a94442; + background-color: #f8ecec; + border-color: #f1d9dd; + border-color: #ca302c; +} + +.errormessage hr { + border-top-color: #eac7cd; +} + +.errormessage .alert-link { + color: #843534; +} + +.warningmessage { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; + border-color: #f0ad4e; +} + +.warningmessage hr { + border-top-color: #f7e1b5; +} + +.warningmessage .alert-link { + color: #66512c; +} + +.infomessage { + color: #31708f; + background-color: #e1f1f9; + border-color: #c3ebf3; + border-color: #2f70a7; +} + +.infomessage hr { + border-top-color: #aee4ef; +} + +.infomessage .alert-link { + color: #245269; +} + /** legacy bootsrap 3 jumbotron **/ diff --git a/ui/src/main/resources/templates/default/index.html b/ui/src/main/resources/templates/default/index.html index 23fb5e916..1618b2460 100644 --- a/ui/src/main/resources/templates/default/index.html +++ b/ui/src/main/resources/templates/default/index.html @@ -23,8 +23,9 @@ - - + + + @@ -494,7 +495,7 @@

Comparateur ouvert

- + diff --git a/ui/src/main/resources/templates/themes/v2/ecoscore.html b/ui/src/main/resources/templates/themes/v2/ecoscore.html index 351715c88..be9b16f2f 100644 --- a/ui/src/main/resources/templates/themes/v2/ecoscore.html +++ b/ui/src/main/resources/templates/themes/v2/ecoscore.html @@ -7,7 +7,7 @@ - L'écoscore : classement écologique des produits | Nudger + L'Impact Score : Eco score des produits éléctroniques et éléctriques | Nudger @@ -29,19 +29,22 @@ - - - -
+
+ + +
+ +
+
-

L’écoscore : l’évaluation écologique des produits

+

L’Impact Score : évaluation de l'impact environnemental de vos produits

@@ -60,7 +63,7 @@

L’écoscore : l’évaluation écologique des produ
-

Qu’est-ce que l’écoscore ?

+

Qu’est-ce que l’Impact Score ?

@@ -92,16 +95,64 @@

Notre ecoscore : transparent, innovant et performant

-

Règles de calculs de l'écoscore

-
+

Comment est calculé l'Impact Score ?

+ + +
-
-
- -
+ +
+ +
+
Synthèse et déploiement
+
+ + + + + + + + + + + + + + + + + +
NomCoef. proposéCoef. appliqué
+ +
+ Ce tableau permet de confronter les coefficients proposés par le système d'IA (Coef. proposé) à ceux actuellement utilisés par Nudger (Coef. appliqué). Les coefficients sont appliquées dans le + fichier de configuration des . +
+ + + +
+
+ +
+ + + + + + + + + +
+ + +
diff --git a/ui/src/main/resources/templates/themes/v2/inc/header-meta.html b/ui/src/main/resources/templates/themes/v2/inc/header-meta.html index 261bb21b5..c11a6553a 100644 --- a/ui/src/main/resources/templates/themes/v2/inc/header-meta.html +++ b/ui/src/main/resources/templates/themes/v2/inc/header-meta.html @@ -10,14 +10,6 @@ - - - - - @@ -26,11 +18,14 @@ - + + - + + + diff --git a/ui/src/main/resources/templates/themes/v2/inc/navbar/navbar-home.html b/ui/src/main/resources/templates/themes/v2/inc/navbar/navbar-home.html index f565266ff..d46fc5bba 100644 --- a/ui/src/main/resources/templates/themes/v2/inc/navbar/navbar-home.html +++ b/ui/src/main/resources/templates/themes/v2/inc/navbar/navbar-home.html @@ -5,21 +5,6 @@ Logo light Logo dark -
diff --git a/ui/src/main/resources/templates/themes/v2/index.html b/ui/src/main/resources/templates/themes/v2/index.html index 4f188e828..6bb41e4e7 100644 --- a/ui/src/main/resources/templates/themes/v2/index.html +++ b/ui/src/main/resources/templates/themes/v2/index.html @@ -1,15 +1,14 @@ - - - + Comparateur écologique | Nudger + @@ -24,338 +23,223 @@ - + - -
- - - + +
- -
+
+

+ Plus qu'un comparateur
+ écologique +

-

- Plus qu'un - comparateur - écologique -

- - - - - - - - - -
-
-
-
-
-

Impact Score

-

Notre ImpactScore est disponible pour les catégories suivantes. Vous trouverez aussi une information approfondie sur les produits

- En savoir plus -
-
- - - - - - - - - - - -
Toutes les catégories - -
-
-
-
-
- - - - +
-
-
-
-

Contribution écologique

- -
- -
-
-
- - -
-
-
-
-
- -
-

10% de nos bénéfices servent à amoindrir l'impact de votre achat. C'est valable sur nos millions de produits, et vous pouvez votez pour l'attribution de cette compensation !

- En savoir plus - -
-
-
-
-
- - - - - - - +
+
+
+
+

Impact Score

+

Notre ImpactScore est disponible pour les catégories suivantes. Vous trouverez aussi une information approfondie sur les produits.

+ +
+
+ + + + + + + +
+ Toutes les catégories +
+
+
+
+
+ +
+
+
+
+

Contribution écologique

+
+ +
+
+
+ + +
+
+
+
+
+

10% de nos bénéfices servent à amoindrir l'impact de votre achat. + C'est valable sur nos millions de produits, et vous pouvez voter pour + l'attribution de cette compensation ! +

+ +
+
+
+
+
- +
-
+

Les meilleurs prix !

-

Nous vous offrons les meilleurs prix du marché. Mieux, nous traçons l'historique des prix pour vous permettre d'acheter au meilleur moment et au meilleur prix

- En savoir plus +

Nous vous offrons les meilleurs prix du marché. Mieux, nous traçons + l'historique des prix pour vous permettre d'acheter au meilleur moment + et au meilleur prix.

-
-

Boosté à l'IA

-

Nous présentons un grand nombre d'informations sur les produits évalués, notament en croisant notre savoir-faire en collecte de la donnée avec les dernières technologies IA

- En savoir plus +
+

Boosté à l'IA

+

Nous présentons un grand nombre d'informations sur les produits évalués, + notamment en croisant notre savoir-faire en collecte de la donnée avec + les dernières technologies IA.

-
+

Libre et ouvert

-

Nous n'utilisons pas de cookie et ne collectons aucune donnée personnelles. Dans une logique de communs numériques, nudger est open-data et open-source

- En savoir plus -
-
-
-
- - - - - - - +
- - - - - - - - - - - - +
-

Les chiffres clés

+

Les chiffres clés

Nudger, c'est :

-
-
-
- -
- - Montant en euros du coup de pouce à date de Nudger pour la planète +
+
+
+
+ + 0 + Montant en euros du coup de pouce à date de Nudger pour la planète +
-
-
- -
- 15M+ Offres commerciales - Un des comparateurs français les plus fournis en références de produits +
+
+
+ 15M+ Offres commerciales + Un des comparateurs français les plus fournis en références de produits +
-
-
- -
- - Nombre de partenaires de Nudger, dont les plus grandes enseignes ! +
+
+
+ 53 + + Nombre de partenaires de Nudger, dont les plus grandes enseignes ! +
+
-
+

Réconcilier écologie et pouvoir d'achat !

-

Consommez moins, consommez mieux. Nudger, le coup de pouce qui vous aide
à amoindrir l'impact de votre shopping en ligne.

+

+ Consommez moins, consommez mieux. Nudger, le coup de pouce qui vous aide +
à amoindrir l'impact de votre shopping en ligne. +

- - +
@@ -371,24 +255,25 @@

Contribution écologique

-

Évaluation environnementale

+

Évaluation environnementale

- +

En savoir plus sur l'évaluation écologique
- Evaluationé cologique des produits + Illustration d'évaluation écologique
-
@@ -396,7 +281,9 @@

Évaluation environnementale

- Comparateur de prix + Illustration de comparateur de prix
@@ -404,7 +291,7 @@

Comparaison de prix

- +

Commencer à comparer
@@ -415,10 +302,6 @@

Comparaison de prix

- - - -
@@ -426,7 +309,7 @@

Comparaison de prix

-

Numérique responsable

+

Numérique responsable

@@ -436,7 +319,9 @@

Numérique responsable

- Pas de cookies + Illustration d'un web sans cookie
@@ -444,30 +329,26 @@

Numérique responsable

- - - -
- Open source / Open data + Illustration représentant l'open source et l'open data
-

Comparateur ouvert

+

Comparateur ouvert

- +

Bases open-data Code opensource - -
@@ -476,112 +357,96 @@

Comparateur ouvert

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - + -