{"id":25353922,"url":"https://github.com/aborroy/alfresco-genai","last_synced_at":"2025-10-29T22:30:56.880Z","repository":{"id":213529257,"uuid":"734334367","full_name":"aborroy/alfresco-genai","owner":"aborroy","description":"Private AI application to Content Management use cases with GenAI \u0026 Alfresco","archived":false,"fork":false,"pushed_at":"2024-09-12T15:12:16.000Z","size":110,"stargazers_count":18,"open_issues_count":0,"forks_count":11,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-09-13T03:43:37.635Z","etag":null,"topics":["ai","alfresco","docker","fosdem2024"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aborroy.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-12-21T12:28:53.000Z","updated_at":"2024-09-12T15:12:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"5027e7e2-7e6a-4478-b99e-9c9e917a43d4","html_url":"https://github.com/aborroy/alfresco-genai","commit_stats":null,"previous_names":["aborroy/alfresco-genai"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Falfresco-genai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Falfresco-genai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Falfresco-genai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Falfresco-genai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aborroy","download_url":"https://codeload.github.com/aborroy/alfresco-genai/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238902582,"owners_count":19549776,"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":["ai","alfresco","docker","fosdem2024"],"created_at":"2025-02-14T19:56:05.576Z","updated_at":"2025-10-29T22:30:51.529Z","avatar_url":"https://github.com/aborroy.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Alfresco integration with Private Generative AI\n\nThis project provides a collection of resources to enable the utilization of Private Generative AI in conjunction with Alfresco. Each service within the project is designed to operate locally, offering flexibility for usage in a development environment.\n\nThe primary scenarios covered by this project are centered around a document:\n\n* Summarize a document in any language and recognize various tags\n* Select a term from a provided list that characterizes a document\n* Answer to a question related to the document\n\nIn addition, it includes a use case related to images:\n\n* Provide a description of a picture\n\n\n## Requirements\n\nFollowing tools can be used to build and deploy this project:\n\n* [Docker 4.25](https://docs.docker.com/get-docker/) (with 20 GB of RAM allocated)\n* [ollama](https://ollama.ai/)\n* [Java 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)\n* [Maven 3.9](https://maven.apache.org/download.cgi)\n\n\u003e\u003e Deploying this project in a production environment could require additional steps to ensure minimal performance and successful execution of actions\n\n\n## Description\n\nThe project includes following components:\n\n* [genai-stack](genai-stack) folder is using https://github.com/docker/genai-stack project to build a REST endpoint that provides AI services for a given document\n* [alfresco](alfresco) folder includes a Docker Compose template to deploy Alfresco Community 23.1\n* [alfresco-ai](alfresco-ai) folder includes a set of projects\n  * [alfresco-ai-model](alfresco-ai/alfresco-ai-model) defines a custom Alfresco content model to store summaries, terms and prompts to be deployed in Alfresco Repository and Share App\n  * [alfresco-ai-applier](alfresco-ai/alfresco-ai-applier) uses the Alfresco REST API to apply summaries or terms for a populated Alfresco Repository based on the application of the `genai:summarizable` aspect\n  * [alfresco-ai-listener](alfresco-ai/alfresco-ai-listener) listens to messages and generates summaries, apply terms and reply answers for create or updated nodes in Alfresco Repository\n* [compose.yaml](compose.yaml) file describes a deployment for Alfresco and GenAI Stack services using `include` directive\n\n```\n┌────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\n│                                                                                                            │\n│                        ┌─Compose────────────────────┐          ┌─Compose────────────────────┐              │\n│                        │                            │          │                            │              │\n│                        │       A L F R E S C O      │          │     G E N  A I  Stack      │              │\n│                        │                            │          │                            │              │\n│                        │ ┌──────────┐ ┌───────────┐ │          │ ┌───┐ ┌─────┐ ┌─────────┐  │              │\n│           ┌────────────┤ │model-repo│ │model-share│ │          │ │llm│ │neo4j│ │langchain│  │              │\n│           │            │ └──────────┘ └───────────┘ │          │ └───┘ └─────┘ └─────────┘  │              │\n│           │            │                            │          │  ollama                    │              │\n│           │            └──────────────▲─────────────┘          └─────────────▲──────────────┘              │\n│           │                           │                                      │                             │\n│           │                           │ http://alfresco:8080                 │ http://genai:8506/summary   │\n│           │            ┌─App──────────┴─────────────┐                        │ http://genai:8506/classify  │\n│           │            │                            │                        │ http://genai:8506/prompt    │\n│           │            │   alfresco-ai-applier      ├────────────────────────┤ http://genai:8506/describe  │\n│           │            │                            │                        │                             │\n│           │            └──────────────┬─────────────┘                        │                             │\n│           │                           │                                      │                             │\n│           │                           │                                      │                             │\n│           │            ┌─Service──────┴─────────────┐                        │                             │\n│           │            │                            │                        │                             │\n│           └────────────►   alfresco-ai-listener     ├────────────────────────┘                             │\n│   tcp://activemq:61616 │                            │                                                      │\n│                        └────────────────────────────┘                                                      │\n│                                                                                                            │\n└────────────────────────────────────────────────────────────────────────────────────────DOCKER NETWORK──────┘\n```\n\n\n## GenAI Stack\n\nThis service, available in [genai-stack](genai-stack) folder, offers various REST endpoints for applying AI operations to a given document.\n\n```\n ┌─Compose────────────────────┐              \n │                            │              \n │     G E N  A I  Stack      │              \n │                            │              \n │ ┌───┐ ┌─────┐ ┌─────────┐  │              \n │ │llm│ │neo4j│ │langchain│  │              \n │ └───┘ └─────┘ └─────────┘  │              \n │  ollama                    │              \n └─────────────▲──────────────┘              \n               │                             \n               │ http://genai:8506/\n```\n\n* Summarizing a document and extracting tags from it\n\n```bash\ncurl --location 'http://localhost:8506/summary' --form 'file=@\"./file.pdf\"'\n\n{\n    \"summary\": \" The text discusses...\",\n    \"tags\": \" Golang, Merkle, Difficulty\",\n    \"model\": \"mistral\"\n}\n```\n\n* Selecting a term from a list that best matches the document\n\n```bash\ncurl --location 'http://localhost:8506/classify?termList=\"Japanese,Spanish,Korean,English,Vietnamese\"' --form 'file=./file.pdf\"'\n\n{\n    \"term\": \" English\",\n    \"model\": \"mistral\"\n}\n```\n\n* Responding to questions related to the document\n\n```bash\ncurl --location 'http://localhost:8506/prompt?prompt=\"What is the name of the son?\"' --form 'file=./file.pdf\"'\n\n{\n    \"answer\": \"The name of the son is Musuko.\",\n    \"model\": \"mistral\"\n}\n```\n\n* Describing a picture\n\n```bash\ncurl --location 'http://localhost:8506/describe' --form 'image=@\"file.jpg\"'\n\n{\n    \"description\": \" In the image, a man with a beard is standing in an indoor setting.\",\n    \"model\": \"llava\"\n}\n```\n\n### Configuration\n\nModify `.env` file values:\n\n```\n# Choose any of the on premise models supported by ollama\nLLM=mistral\nLLM_VISION=llava\n\n # Any language name supported by chosen LLM\nSUMMARY_LANGUAGE=English\n# Number of words for the summary\nSUMMARY_SIZE=120\n# Number of tags to be identified with the summary\nTAGS_NUMBER=3 \n```\n\n\u003e\u003e Note that LLM_VISION must be a LLM with vision encoder\n\n## Alfresco\n\nAlfresco service, available in [alfresco](alfresco) folder, includes custom content model definition and additional events configuration.\n\n```\n ┌─Compose────────────────────┐\n │                            │\n │       A L F R E S C O      │\n │                            │\n │ ┌──────────┐ ┌───────────┐ │\n │ │model-repo│ │model-share│ │\n │ └──────────┘ └───────────┘ │\n │                            │\n └──────────────▲─────────────┘\n                │              \n                │ http://alfresco:8080\n```\n\n* Content Model for Repository is available in [genai-model-repo](alfresco-ai/alfresco-ai-model/genai-model-repo)\n  * `genai:summarizable` aspect is used to store `summary` and `tags` generated with AI\n  * `genai:promptable` aspect is used to store the `question` provided by the user and the `answer` generated with AI\n  * `genai:classifiable` aspect is used to store the list of terms available for the AI to classify a document. It should be applied to a folder\n  * `genai:classified` aspect is used to store the term selected by the AI. It should be applied to a document\n  * `genai:descriptable` aspect is used to store the description generated with AI. It should be applied to a picture\n\n* Forms and configuration to handle custom Content Model from Share are available in [genai-model-share](alfresco-ai/alfresco-ai-model/genai-model-share)\n\n* Additional configuration for Repository\n  * Since `alfresco-ai-listener` is listening to renditions, default `event2` filter should be modified. Following configuration has been added to `alfresco` service in `compose.yaml`\n```\n-Drepo.event2.filter.nodeTypes=\"sys:*, fm:*, cm:failedThumbnail, cm:rating, rma:rmsite include_subtypes, usr:user\"\n```  \n\n\n## Alfresco AI Applier\n\nThis Spring Boot application utilizes the Alfresco REST API to fetch all documents from a given Alfresco folder and apply a single action:\n\n* The `Summarizing` action involves retrieving documents from a folder using the Alfresco Search API, checking for the availability of PDF renditions, and updating document nodes with summaries obtained from the GenAi service.\n* The `Classifying` action retrieves documents from a folder using the Alfresco Search API, checks for the availability of PDF renditions, and updates document nodes by selecting a term, from a list of terms using the GenAi service.\n* The `Describing` actions retrieves pictures from a folder using the Alfresco Search API and updates image nodes with descriptions obtained from the GenAi service.\n\n```\n ┌─Compose────────────────────┐          ┌─Compose────────────────────┐          \n │                            │          │                            │          \n │       A L F R E S C O      │          │     G E N  A I  Stack      │          \n │                            │          │                            │          \n │ ┌──────────┐ ┌───────────┐ │          │ ┌───┐ ┌─────┐ ┌─────────┐  │          \n │ │model-repo│ │model-share│ │          │ │llm│ │neo4j│ │langchain│  │          \n │ └──────────┘ └───────────┘ │          │ └───┘ └─────┘ └─────────┘  │          \n │                            │          │  ollama                    │          \n └──────────────▲─────────────┘          └─────────────▲──────────────┘          \n                │                                      │                         \n                │ http://alfresco:8080                 │ http://genai:8506/summary\n ┌─App──────────┴─────────────┐                        │ http://genai:8506/classify\n │                            │                        │ http://genai:8506/describe\n │   alfresco-ai-applier      ├────────────────────────┘\n │                            │                        \n └────────────────────────────┘                        \n```\n\n### Configuration\n\nModify property values in `application.properties` file:\n\n```\n# Spring Boot properties\n# Disable Spring Boot banner\nspring.main.banner-mode=off\n\n# Logging Configuration\nlogging.level.org.springframework=ERROR\nlogging.level.org.alfresco=INFO\nlogging.pattern.console=%msg%n\n\n# Alfresco Server Configuration\n# Basic authentication credentials for Alfresco Server\ncontent.service.security.basicAuth.username=admin\ncontent.service.security.basicAuth.password=admin\n# URL and path for Alfresco Server API\ncontent.service.url=http://localhost:8080\ncontent.service.path=/alfresco/api/-default-/public/alfresco/versions/1\n\n# Alfresco Repository Content Model (Summary)\n# Aspect that triggers the summarization task\ncontent.service.summary.aspect=genai:summarizable\n# Node property to store the summary obtained from GenAI Stack\ncontent.service.summary.summary.property=genai:summary\n# Node property to store tags obtained from GenAI Stack; use TAG as a value to use a tag instead of a property\ncontent.service.summary.tags.property=genai:tags\n# Node property to store the Large Language Model (LLM) used; use TAG as a value to use a tag instead of a property\ncontent.service.summary.model.property=genai:llmSummary\n\n# Alfresco Repository Content Model (Classify)\n# Node property that includes terms for classification\ncontent.service.classify.terms.property=genai:terms\n# Aspect that enables classification task\ncontent.service.classify.aspect=genai:classified\n# Node property to fill with the term\ncontent.service.classify.term.property=genai:term\n# Node property to fill with the model\ncontent.service.classify.model.property=genai:llmClassify\n\n# Alfresco Repository Content Model (Description)\n# Aspect that triggers the description task\ncontent.service.description.aspect=genai:descriptable\n# Node property to store the description obtained from GenAI Stack\ncontent.service.description.description.property=genai:description\n# Node property to store the Large Language Model (LLM) used; use TAG as a value to use a tag instead of a property\ncontent.service.description.model.property=genai:llmDescription\n\n# GenAI Client Configuration\n# Host URL for the Document GenAI service\ngenai.url=http://localhost:8506\n# Request timeout in seconds for GenAI service requests\ngenai.request.timeout=1200\n\n# Alfresco AI Applier Configuration\n# Root folder in Alfresco Repository to apply GenAI action\napplier.root.folder=/app:company_home/app:shared\n# Choose one action: SUMMARY, CLASSIFY, DESCRIBE\napplier.action=SUMMARY\n# List of terms to be applied for CLASSIFY action (ignored when using SUMMARY action)\napplier.action.classify.term.list=English,Spanish,Japanese,Vietnamese\n# Maximum number of items to be retrieved from Alfresco Repository in each iteration\nrequest.max.items=20\n```\n\nConfiguration parameters can be also used as command line arguments or Docker environment variables, like in the following sample:\n\n```bash\n$ java -jar target/alfresco-ai-applier-0.8.0.jar \\\n--applier.root.folder=/app:company_home/app:shared/cm:picture \\\n--applier.action=DESCRIBE \\\n--logging.level.org.alfresco=DEBUG\n```\n\n\n## Alfresco AI Listener\n\nThis Spring Boot application is designed to capture summary, classification, or prompting aspect settings by listening to ActiveMQ events. The application then forwards the request to the GenAI Stack and subsequently updates the Alfresco Node using the REST API.\n\n```\n              ┌─Compose────────────────────┐          ┌─Compose────────────────────┐\n              │                            │          │                            │\n              │       A L F R E S C O      │          │     G E N  A I  Stack      │\n              │                            │          │                            │\n              │ ┌──────────┐ ┌───────────┐ │          │ ┌───┐ ┌─────┐ ┌─────────┐  │\n ┌────────────┤ │model-repo│ │model-share│ │          │ │llm│ │neo4j│ │langchain│  │\n │            │ └──────────┘ └───────────┘ │          │ └───┘ └─────┘ └─────────┘  │\n │            │                            │          │  ollama                    │\n │            └──────────────▲─────────────┘          └─────────────▲──────────────┘\n │ tcp://activemq:61616      │                                      │               \n │                           │ http://alfresco:8080                 │ http://genai:8506/summary\n │            ┌─Service──────┴─────────────┐                        │ http://genai:8506/classify\n │            │                            │                        │ http://genai:8506/prompt\n └────────────►   alfresco-ai-listener     ├────────────────────────┘ http://genai:8506/describe                        \n              │                            │                                                  \n              └────────────────────────────┘                                                  \n```\n\n### Configuration\n\nModify property values in `application.properties` file or use Docker environment setings:\n\n```\n# Spring Boot properties\nspring.main.banner-mode=off\nlogging.level.org.springframework=ERROR\nlogging.level.org.alfresco=INFO\nlogging.pattern.console=%msg%n\n\n# Alfresco Server Configuration\n# Basic authentication credentials for Alfresco Server\ncontent.service.security.basicAuth.username=admin\ncontent.service.security.basicAuth.password=admin\n# URL and path for Alfresco Server API\ncontent.service.url=http://localhost:8080\ncontent.service.path=/alfresco/api/-default-/public/alfresco/versions/1\n\n\n# Alfresco Repository Content Model (Summary)\n# Aspect that triggers the summarization task\ncontent.service.summary.aspect=genai:summarizable\n# Node property to store the summary obtained from GenAI Stack\ncontent.service.summary.summary.property=genai:summary\n# Node property to store tags obtained from GenAI Stack; use TAG as a value to use a tag instead of a property\ncontent.service.summary.tags.property=genai:tags\n# Node property to store the Large Language Model (LLM) used; use TAG as a value to use a tag instead of a property\ncontent.service.summary.model.property=genai:llmSummary\n\n# Alfresco Repository Content Model (Prompt)\n# Aspect that enables prompt task\ncontent.service.prompt.aspect=genai:promptable\n# Node property that contains a question\ncontent.service.prompt.question.property=genai:question\n# Node property to fill with the answer\ncontent.service.prompt.answer.property=genai:answer\n# Node property to fill with the model\ncontent.service.prompt.model.property=genai:llmPrompt\n\n# Alfresco Repository Content Model (Classify)\n# Node property that includes terms for classification\ncontent.service.classify.terms.property=genai:terms\n# Aspect that enables classification task\ncontent.service.classify.aspect=genai:classified\n# Node property to fill with the term\ncontent.service.classify.term.property=genai:term\n# Node property to fill with the model\ncontent.service.classify.model.property=genai:llmClassify\n\n# Alfresco Repository Content Model (Description)\n# Aspect that triggers the description task\ncontent.service.description.aspect=genai:descriptable\n# Node property to store the description obtained from GenAI Stack\ncontent.service.description.description.property=genai:description\n# Node property to store the Large Language Model (LLM) used; use TAG as a value to use a tag instead of a property\ncontent.service.description.model.property=genai:llmDescription\n\n\n# ActiveMQ Server\nspring.activemq.brokerUrl=tcp://localhost:61616\nspring.jms.cache.enabled=false\nalfresco.events.enableSpringIntegration=false\nalfresco.events.enableHandlers=true\n\n# GenAI Client Configuration\n# Host URL for the Document GenAI service\ngenai.url=http://localhost:8506\n# Request timeout in seconds for GenAI service requests\ngenai.request.timeout=1200\n```\n\nConfiguration parameters can be also used as command line arguments or Docker environment variables, like in the following sample:\n\n```bash\n$ java -jar target/alfresco-ai-listener-0.8.0.jar --logging.level.org.alfresco=DEBUG\n```\n\n# Use Case 1: Existing Content\n\n0. Before proceeding, ensure that Docker, ollama, Java, and Maven are up and working:\n\n```sh\n$ ollama -v\nollama version is 0.1.31\n$ docker -v\nDocker version 25.0.3, build 4debf41\n$ java -version\nopenjdk version \"17.0.5\" 2022-10-18\n$ mvn -v\nApache Maven 3.9.6\n```\n\n1. Verify that `compose-ai.yaml` is commented in [compose.yaml](compose.yaml)\n\n```sh\n$ cat compose.yaml\ninclude:\n  - genai-stack/compose.yaml\n  - alfresco/compose.yaml\n#  - alfresco/compose-ai.yaml\n```\n\n2. Start Docker containers for Alfresco and GenAI Stack\n\n```sh\n$ docker compose up\n```\n\n3. Once Alfresco is up \u0026 running, upload a number of documents to a given folder, for instance `/app:company_home/app:shared`. You may use the Legacy UI with default credentials (admin/admin) available in http://localhost:8080/share\n\n4. Compile the Alfresco AI Applier (if required)\n\n```sh\n$ cd alfresco-ai/alfresco-ai-applier\n$ mvn clean package\n```\n\n5. Run the Alfresco AI Applier to summarize the documents in a given folder\n\n```sh\n$ java -jar target/alfresco-ai-applier-0.8.0.jar \\\n  --applier.root.folder=/app:company_home/app:shared \\\n  --applier.action=SUMMARY\n```\n\n\u003e\u003e Once this command has finished, every document in the folder should include a populated `Summary` property (accessible in \"view\" mode)\n\n6. Run the Alfresco AI Applier to classify the documents based on a list of terms in a specific folder\n\n```sh\n$ cd alfresco-ai/alfresco-ai-applier\n$ java -jar target/alfresco-ai-applier-0.8.0.jar \\\n  --applier.root.folder=/app:company_home/app:shared \\\n  --applier.action=CLASSIFY \\\n  --applier.action.classify.term.list=English,Spanish,Japanese,Vietnamese\n```\n\n\u003e\u003e Once this command has finished, every document in the folder should include a populated `Term` property selected from the Term List (accessible in \"view\" mode)\n\n7. Upload a number of pictures to an specific folder, for instance `/app:company_home/app:shared/cm:pictures`\n\n8. Run the Alfresco AI Applier to summarize the documents, note that `applier.root.folder` uses this folder already created\n\n```sh\n$ cd alfresco-ai/alfresco-ai-applier\n$ java -jar target/alfresco-ai-applier-0.8.0.jar \\\n  --applier.root.folder=/app:company_home/app:shared/cm:pictures \\\n  --applier.action=DESCRIBE\n```\n\n\u003e\u003e Once this command has finished, every picture in the folder should include a populated `Description` property (accessible in \"view\" mode)\n\n\n# Use Case 2: New Content\n\n0. Before proceeding, ensure that Docker, ollama, Java, and Maven are up and working:\n\n```sh\n$ ollama -v\nollama version is 0.1.31\n$ docker -v\nDocker version 25.0.3, build 4debf41\n$ java -version\nopenjdk version \"17.0.5\" 2022-10-18\n$ mvn -v\nApache Maven 3.9.6\n```\n\n1. Build `alfresco-ai-listener` Docker Image if required\n\n```sh\n$ cd alfresco-ai/alfresco-ai-listener\n$ mvn clean package\n$ docker build . -t alfresco-ai-listener\n```\n\n2. Verify that `compose-ai.yaml` is uncommented in [compose.yaml](compose.yaml)\n\n```sh\n$ cat compose.yaml\ninclude:\n  - genai-stack/compose.yaml\n  - alfresco/compose.yaml\n  - alfresco/compose-ai.yaml\n```\n\n3. Start Docker containers for Alfresco and GenAI Stack\n\n```sh\n$ docker compose up\n```\n\n4. Use Alfresco Legacy UI, available in http://localhost:8080/share, to get a summary for a document\n\n* Apply Summarizable with AI (`genai:summarizable`) aspect to a node\n* Wait until GenAI populates `Summary` property (accesible in \"view\" mode)\n\n5. Classify a document \n\n* Apply Classifiable with AI (`genai:classifiable`) aspect to a folder\n* Add a list of terms separated by comma in property Terms (`genai:terms`) of the folder\n* Add a document inside this folder \n* Apply the aspect Classified with AI (`genai:classified`) to the document\n* Wait until GenAI selects one term from the list and populates `Term` property of the document (accesible in \"view\" mode)\n\n6. Ask a question\n\n* Apply Promptable with AI (`genai:promptable`) aspect to a document\n* Type your question in the property Question\n* Wait until GenAI populates `Answer` property (accesible in \"view\" mode)\n\n7. Describe a picture\n\n* Apply Descriptable with AI (`genai:descriptable`) aspect to a picture\n* Wait until GenAI populates `Description` property (accesible in \"view\" mode)\n\n\u003e\u003e These operations may be automated by creating folder rules that apply required aspects to documents uploaded to an specific folder\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faborroy%2Falfresco-genai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faborroy%2Falfresco-genai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faborroy%2Falfresco-genai/lists"}