{"id":13588465,"url":"https://github.com/Lazzzer/structurizer","last_synced_at":"2025-04-08T06:32:05.782Z","repository":{"id":182316051,"uuid":"655694751","full_name":"Lazzzer/structurizer","owner":"Lazzzer","description":"Structurizer is a web application that helps you extract structured data from PDF files with Large Language Models!","archived":false,"fork":false,"pushed_at":"2024-08-02T17:57:24.000Z","size":1511,"stargazers_count":25,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-06T08:40:14.103Z","etag":null,"topics":["large-language-models","llm","next-auth","nextjs","openai","react","shadcn-ui","structured-data","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lazzzer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-19T12:09:34.000Z","updated_at":"2024-10-31T15:58:49.000Z","dependencies_parsed_at":"2023-07-19T14:51:26.973Z","dependency_job_id":"ed613167-c747-486c-a244-cb3f46fa860e","html_url":"https://github.com/Lazzzer/structurizer","commit_stats":null,"previous_names":["lazzzer/structurizer"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lazzzer%2Fstructurizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lazzzer%2Fstructurizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lazzzer%2Fstructurizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lazzzer%2Fstructurizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lazzzer","download_url":"https://codeload.github.com/Lazzzer/structurizer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247792077,"owners_count":20996876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["large-language-models","llm","next-auth","nextjs","openai","react","shadcn-ui","structured-data","typescript"],"created_at":"2024-08-01T15:06:43.894Z","updated_at":"2025-04-08T06:32:04.015Z","avatar_url":"https://github.com/Lazzzer.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/Lazzzer/structurizer/assets/43219964/1a642ced-2f67-4e0f-805e-7666afbf8bb8\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/Lazzzer/structurizer/assets/43219964/6b947300-1adc-4c0b-a6c2-f398a205e533\"\u003e\n    \u003cimg src=\"https://github.com/Lazzzer/structurizer/assets/43219964/6b947300-1adc-4c0b-a6c2-f398a205e533\" alt=\"Structurizer Logo\" width=\"75%\"\u003e\n  \u003c/picture\u003e\n\u003c/h1\u003e\n\nCe projet fait partie d'un Travail de Bachelor réalisé à l'[HEIG-VD](https://heig-vd.ch/), dans la filière Informatique et systèmes de communication (ISC) par Lazar Pavicevic et supervisé par le Professeur Marcel Graf.\n\nLe Travail de Bachelor est également composé d'une API accessible sur ce repository :\n\n#### [`📄 LLM-Structurizer`](https://github.com/Lazzzer/llm-structurizer)\n\nStructurizer est une application web de structuration de données issues du langage naturel. \nL'application se repose sur l'API `LLM-Structurizer` qui, à son tour, utilise des LLMs pour structurer les données.\n\nStructurizer propose les fonctionnalités suivantes:\n* Upload de documents pour extraction et structuration des données.\n* Structuration des données guidée sous forme de pipelines ou automatique.\n* Vérification humaine des données structurées avec assistance possible d'un LLM.\n* Consultation des données structurées et affichage de statistiques et agrégations sous forme de graphiques.\n* *Question Answering* en langage naturel sur les données structurées.\n\nL'application web est au stade de _Proof of Concept_, elle propose la structuration de documents pdf uniquement. Elle se limite également à la catégorisation et l'extraction de données structurées de *factures*, de *tickets de reçu* et de *relevés de carte de crédit*.\n\n## Démo de l'application\n\nhttps://github.com/Lazzzer/structurizer/assets/43219964/41d7a85d-0f56-48ca-ae98-5d996849a9ad\n\n## Stack\n\n- [Typescript](https://www.typescriptlang.org)\n- [React](https://react.dev/learn)\n- [Next.js](https://nextjs.org/docs)\n- [TailwindCSS](https://tailwindcss.com/docs/installation)\n- [Shadcn/ui](https://ui.shadcn.com/docs)\n- [PostgreSQL](https://www.postgresql.org/docs/15/index.html)\n- [Prisma](https://www.prisma.io/docs/getting-started)\n\n## Object Storage\n\nL'application stocke ses documents pdf en utilisant le package `@aws-sdk/client-s3`. N'import quel Object Storage compatible S3 devrait fonctionner.\n\nLes Object Storages suivants ont été testés et sont fonctionnels avec l'application:\n- [x] [Amazon S3](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/getting-started-nodejs.html)\n- [x] [Cloudflare R2](https://developers.cloudflare.com/r2/get-started/)\n\n\n## Prérequis\n\n- [NodeJS](https://nodejs.org/en/download/) \u003e= version 16\n- [NPM](https://docs.npmjs.com/getting-started) \u003e= version 8\n- [PostgreSQL](https://www.postgresql.org/docs/15/index.html) version 15\n- [Docker](https://docs.docker.com/get-started/)\n- [Clé d'API OpenAI](https://platform.openai.com/account/api-keys)\n- [Clé d'API de LLM-Structurizer](https://github.com/Lazzzer/llm-structurizer)\n- Credentials d'un Object Storage compatible S3\n\n## Environnement de développement\n\n### Clonage du repository\n\n```bash\ngit clone git@github.com:Lazzzer/structurizer.git\n```\n\n### Installation des dépendances\n\n```bash\ncd structurizer\nnpm install\n```\n\n### Ajout des variables d'environnement\n\nCréer un fichier `.env` à partir du fichier [.env.example](https://github.com/Lazzzer/structurizer/blob/main/.env.example) et mettez-y vos valeurs.\n\nExemple:\n\n```bash\n# Format: postgresql://[POSTGRES_USER]:[POSTGRES_PASSWORD]@[DB_HOST]:[DB_PORT]/[DB_NAME]?schema=[DB_SCHEMA]\u0026connect_timeout=300\nDATABASE_URL=postgresql://postgres:root@localhost:5432/structurizer?schema=public\u0026connect_timeout=300\n\n# Vous pouvez générer un secret ici: https://generate-secret.vercel.app/32\nNEXTAUTH_SECRET=\nNEXTAUTH_URL=http://localhost:3001\n\n# S3 Credentials et le nom du bucket\nS3_ACCESS_KEY_ID=...\nS3_SECRET_ACCESS_KEY=...\nS3_BUCKET=...\nS3_REGION=...\nS3_ENDPOINT=...\n\n# L'URL de votre instance LLM-Structurizer\nLLM_STRUCTURIZER_URL=http://localhost:3000\n\n# Les clés d'API\nX_API_KEY=...\nOPENAI_API_KEY=sk-...\n```\n\n### Initialisation de la base de données\n\n```bash\nnpx prisma db push\n```\n\n### Lancement du serveur de développement\n\n\u003e **Note**  \n\u003e La base de données doit être initialisée et accessible par le serveur.\n\n```bash\nnpm run dev\n```\n\nL'application est accessible sur ce [lien](http://localhost:3001).\n\n## CI\n\nLa branche `main` est protégée et les pull requests doivent passer l'action `ci` pour être mergées.\n\n\u003cimg width=\"1134\" alt=\"Screenshot CI pipelines\" src=\"https://github.com/Lazzzer/structurizer/assets/43219964/1cef8d46-7644-4fe6-94de-d0e4a308527e\"\u003e\n\nLa CI est gérée avec une Github Action qui sépare le processus en trois étapes.\n\nD'abord, elle effectue une installation des dépendances et une mise en cache pour les prochains runs.\nEnsuite, elle lance le linting, puis finalement elle vérifie, le build. Les erreurs de négligence détectées lors du linting empêcheront le lancement du build, ce dernier étant relativement long.\n\nCe workflow s'inspire fortement de l'excellent article de Maxime Heckel sur le [sujet](https://blog.maximeheckel.com/posts/building-perfect-github-action-frontend-teams/).\n\n## Environnement de production en local\n\n\u003e **Note**  \n\u003e Docker est nécessaire pour cette étape.\n\nL'environnement de production se lance à l'aide de docker compose, dont un template est disponible dans le fichier [docker-compose.example.yml](https://github.com/Lazzzer/structurizer/blob/main/docker-compose.example.yml). Il ne dépend pas de l'installation précédente.\n\nComme pour le fichier `.env`, il faut créer un fichier `docker-compose.yml`  à partir du template et y mettre les bonnes variables.\n\nLe docker-compose fourni part du principe que vous lancez l'instance de `LLM-Structurizer` avec son propre docker-compose et connecte `structurizer-app` au network `llm-structurizer_network` pour faire les appels à l'API. La variable `LLM_STRUCTURIZER_URL` peut être ajustée pour répondre aux besoins de votre configuration.\n\n### Création des images\n\n```bash\ncd structurizer\ndocker compose build\n```\n\nL'image de l'application se trouve dans le fichier [Dockerfile](https://github.com/Lazzzer/structurizer/blob/main/Dockerfile), basée sur Debian 10.\n\n### Lancement des containers\n\n```bash\ndocker compose up\n```\n\nIl est préférable que la base de données soit initialisée avant de lancer le container du serveur. Dans ce cas, vous pouvez lancer les commandes suivantes:\n\n```bash\n# Lancement de la base de données [en background s'il le faut]\ndocker compose up db [-d]\n\n# Lancement de l'application\ndocker compose up app [-d]\n```\n\n### Lancement des migrations\n\nLe serveur de l'application web est initialisé, si ce dernier ne tourne pas en fond, ouvrez une nouvelle instance de votre terminal et lancez la commande suivante:\n\n```bash\ndocker exec -it structurizer-app npx prisma migrate deploy\n```\nLa base de données reste accessible localement avec les valeurs présentes dans `DATABASE_URL` sauf celle du port qui forwardée sur `5433` pour éviter tout conflit avec la base de données de `LLM-Structurizer`.\n\nL'application est maintenant disponible sur le même [lien](http://localhost:3001) que précédemment.\n\n### Arrêt des containers\n\n```bash\ndocker compose down\n```\n\n## Considérations pour la mise en production\n\nLe [Dockerfile](https://github.com/Lazzzer/structurizer/blob/main/Dockerfile) avec ses variables d'environnement suffit pour avoir une API fonctionnelle.\nL'image n'est actuellement pas dans un container registry.\n\nLors du premier déploiement, il faut s'assurer que la base de données associée ait bien reçu les migrations avec `npx prisma migrate deploy`. La commande peut se lancer depuis un container actif du serveur de l'application. Il est également possible de lancer la commande localement depuis la racine du projet, après avoir modifié la variable d'environnement `DATABASE_URL` avec la _connection string_ de la base de données de production.\n\nLe déploiement du projet a été testé sur [App Platform](https://www.digitalocean.com/products/app-platform) de Digital Ocean.\n\n## Inspirations \u0026 citations\n\nCe projet s'inspire fortement de l'ingéniosité des travaux suivants :\n* [nextjs-postgres-auth-starter](https://github.com/vercel/nextjs-postgres-auth-starter) : Ce repository a permis une mise en place rapide de Next.js 13 avec un template pour [NextAuth.js](https://next-auth.js.org/getting-started/introduction) et [Prisma](https://www.prisma.io/docs/getting-started).\n* [shadcn/taxonomy](https://github.com/shadcn/taxonomy) : Cet excellent projet met en avant les nouvelles fonctionnalités de Next.js 13 version *App Router* et de la librairie de composants React [shadcn/ui](https://ui.shadcn.com/docs).\n* [Build UI recipes](https://buildui.com/recipes) : Il s'agit d'une collection de code snippets par [Sam Selikoff](https://github.com/samselikoff) pour des interfaces utilisateurs modernes et intuitives. Structurizer contient notamment du code inspiré du [Multistep Wizard](https://buildui.com/recipes/multistep-wizard) et de l'[Artificial Delay](https://buildui.com/recipes/artificial-delay).\n* [Animated Gradient Border CSS](https://codepen.io/shantanu-jana/pen/XWVBJRv) : Un code snippet par Shantanu Jana modifié pour le glowing effect présent un peu partout dans l'application.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLazzzer%2Fstructurizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FLazzzer%2Fstructurizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLazzzer%2Fstructurizer/lists"}