Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
dc86b32
add(event): events to serialize and deserialize
Popochounet Jan 5, 2026
44680ff
evol(module): now use ModuleEvent
Popochounet Jan 5, 2026
4859fd0
evol(modules): use of ModuleEvent
Popochounet Jan 5, 2026
4b90c4a
wip(command): add CommandEvent (is not received yet)
Popochounet Jan 14, 2026
8438ee9
evol(control_channel): dealer register with auth(wip) then start
Popochounet Jan 15, 2026
29079c1
evol(agent): thread is now inside zmq classes
Popochounet Jan 15, 2026
31c8fb1
fix(core): agent and huri now exit cleanly
Popochounet Jan 15, 2026
3ad3368
evol(events): update events naming
Popochounet Jan 15, 2026
97f949d
wip(control_channel): huri can handle control
Popochounet Jan 22, 2026
9c2e564
remove(archi): old deprecated archi files
Popochounet Mar 16, 2026
2ac1433
refacto(module): is now a basic processor with one input and output type
Popochounet Mar 16, 2026
d6eae24
feat(session+EventGraph): has an EventGraph that connects modules and…
Popochounet Mar 16, 2026
efe6cf8
refacto(huri): huri is now a fastapi ray server, launching ray deploy…
Popochounet Mar 16, 2026
90b6d01
evol(launch_huri): launch deployement and bind them to main ray serve…
Popochounet Mar 16, 2026
3d6936c
wip(client): connect to huri via websocket, stream audio and receive …
Popochounet Mar 16, 2026
047a655
evol(MIC+STT): changes for new archi
Popochounet Mar 16, 2026
78513e9
add(Sender): module that sends huri output to client
Popochounet Mar 16, 2026
48e750b
remove(logger): deprecated logger
Popochounet Mar 16, 2026
4bc4b6b
feat(linter): added linter config file + Makefile (make lint)
Popochounet Mar 16, 2026
d5071e1
fix(linter): make lint
Popochounet Mar 16, 2026
06334b7
remove(config): deprecated config files + quick_launch.sh
Popochounet Mar 16, 2026
861d43e
Merge pull request #10 from Sentience-Robotics/aau/#9/refacto_ray
Popochounet May 2, 2026
aef8d0a
feat(config): module config and client config
Popochounet Mar 23, 2026
9ff235d
evol(module): type ModuleWithHandle
Popochounet Mar 23, 2026
e4fa54f
feat(factory): factory to build modules
Popochounet Mar 23, 2026
727b975
evol(launch_huri): can now be launch via ray serve config file
Popochounet Mar 23, 2026
5415fdd
evol(huri): can now build client config modules and run them
Popochounet Mar 23, 2026
1000fb8
feat(client): can now send config to huri
Popochounet Mar 23, 2026
5c641df
evol(stt): add STTHandle to STT
Popochounet Mar 23, 2026
1c748f5
evol(Makefile): mypy check untyped defs
Popochounet Mar 23, 2026
3ac16f8
remove(huri): useless module EMB
Popochounet May 3, 2026
d943276
evol(requirement): clean requirement
Popochounet May 3, 2026
8e0077f
feat(README): Getting Started, Usage + config template
Popochounet May 3, 2026
5e6be25
Merge pull request #11 from Sentience-Robotics/aau/#10/ray_config_files
Popochounet May 4, 2026
aab9b7c
wip(Embedding): pseudo module
Popochounet Mar 23, 2026
f397775
evol(events): error handling
Popochounet May 3, 2026
d57580f
evol(MIC): WebRTC vad to detect if speech, no longer a threshold
Popochounet May 3, 2026
9a8f8e2
evol(STT): use of faster whisper can transcript in real time + slidin…
Popochounet May 3, 2026
e102b0e
evol(client config): sample rate, frame duration + mic,stt modules args
Popochounet May 3, 2026
8d55348
evol(sender): now can send json serializable object only
Popochounet May 3, 2026
11f7f7f
fix(client config): wrong arg name
Popochounet May 3, 2026
2026836
feat(TAG): aggregate all transcription into one question
Popochounet May 3, 2026
3c2af5c
fix(linter): make lint
Popochounet May 3, 2026
0cb10ce
fix(TAG): some match would destroy sentence
Popochounet May 3, 2026
71ba721
evol(requirement): new modules
Popochounet May 3, 2026
60f9470
evol(config): useless config + handle
Popochounet May 3, 2026
747d1a1
evol(README): launch_huri without config file
Popochounet May 3, 2026
9ee07ba
Merge pull request #12 from Sentience-Robotics/aau/#11/speech_to_ques…
Popochounet May 4, 2026
661b1a1
Mvr/#44/connection handle (#13)
MatthiasvonRakowski May 6, 2026
592034c
Mvr/#14/ids managment (#19)
MatthiasvonRakowski May 18, 2026
9e089b8
feat(event): event data are now typed to be validated and serialisable
Popochounet May 18, 2026
26dd177
feat(client): client can now send multiple data, must be event data
Popochounet May 18, 2026
c3fac88
evol(config): update client config
Popochounet May 18, 2026
fffc646
fix(linting): make lint
Popochounet May 18, 2026
5e74669
Mvr/#17/launch docker (#21)
MatthiasvonRakowski May 22, 2026
cbf18e2
Merge remote-tracking branch 'origin/dev' into aau/#22/client_without…
Popochounet May 24, 2026
e6cd134
evol(client): moved save/load user id in new client class
Popochounet May 24, 2026
734ec67
fix(events): fix class comparision
Popochounet May 24, 2026
54b1fcd
evol(client): cleaner exit
Popochounet May 24, 2026
2576631
evol(huri): explicit client runtime error
Popochounet May 24, 2026
0a0bcf6
evol(rag): implemented event for rag
Popochounet May 24, 2026
230f9ea
feat(doxygen): added doxygen documentation
Popochounet May 25, 2026
dbc7f1a
Merge pull request #23 from Sentience-Robotics/aau/#22/client_without…
Popochounet May 25, 2026
d29711b
evol(huri): documentation
Popochounet May 25, 2026
06bf2ea
evol(EventGraph): documentation
Popochounet May 25, 2026
0a42748
evol(module): documentation
Popochounet May 25, 2026
d076dc3
evol(session): documentation
Popochounet May 25, 2026
5c3664b
evol(readme): presentation + folder/module structure + dev documenta…
Popochounet May 25, 2026
c97d63b
Merge pull request #26 from Sentience-Robotics/aau/#20/documentation
Popochounet May 26, 2026
8952bce
fix(readme): wrong documentation link
Popochounet May 26, 2026
5768b11
fix(readme): typo
Popochounet May 26, 2026
2a3d9af
feat(gesture): all gesture ray module from EMAGE
bernTP May 26, 2026
17098ac
feat(tts): all files related to CosyTTS
bernTP May 26, 2026
2847f72
feat(helm): local cluster featuring AMD and NVIDIA
bernTP May 26, 2026
251382b
Merge branch 'tpm/#29/emage-gesture' into tpm/#32/tts-gesture-rag
bernTP May 26, 2026
145cbce
Merge branch 'tpm/#30/local-kube-example' into tpm/#32/tts-gesture-rag
bernTP May 26, 2026
5e9eb3b
Merge branches
bernTP May 26, 2026
bb455c4
Merge branch 'tpm/#28/tts-huri-module' into tpm/#32/tts-gesture-rag
bernTP May 27, 2026
a237d26
fixed(tts): module deplyment and init
bernTP May 27, 2026
d104b7b
fixed(rag): streaming tokens + removing deprecated docker_services si…
bernTP May 27, 2026
616087a
feated(helm): modules loading between local nvidia and amd example he…
bernTP May 27, 2026
4e0904b
Merge pull request #27 from Sentience-Robotics/aau/#20/fix-doc-link
Popochounet May 28, 2026
fe93959
fixed(tts): gesture and tts connection using pts + summarizing data f…
bernTP May 29, 2026
b728cd8
fixed(rag): init arguments not being taken in kube values + hot value…
bernTP May 29, 2026
ad7f658
fixed(tts): fixed bi stream capacity + debug logs support directly in…
bernTP May 29, 2026
080f342
feated(stt): using kube PVC to store whisper model
bernTP May 29, 2026
5146a0e
feat(kube): ingress template to avoid port forwarding huri for the so…
bernTP May 29, 2026
d17f6bf
feat(kube): new values to support new ingress and stt cache system (+…
bernTP May 29, 2026
69c614b
fix(tts): text to speech missing tokens in audio
bernTP May 31, 2026
01ac7ef
feat(client): option to save streamed TTS audio to .wav files
bernTP May 31, 2026
28e279f
fix(stt): missing lookup for PVC on kube init
bernTP May 31, 2026
734aaf9
feat(gesture): warmup to generate output faster on first time
bernTP Jun 1, 2026
191b6b0
feat(tts): using CosyVoice3 model
bernTP Jun 1, 2026
5bc82be
fixed(stt): audio_in event for the pipeline, so that text is read by RAG
bernTP Jun 1, 2026
14a06bf
fix(stt): going back to previous STT impelmentation, with a simpler h…
bernTP Jun 1, 2026
a1f5e6d
feat(rag): profile data from RAG based of uid
bernTP Jun 1, 2026
2e74004
fixed(huri): Qdrant too old dependancy + new nvidia dependancies
bernTP Jun 1, 2026
1164213
feat(huri): core config uid fetching
bernTP Jun 1, 2026
109491a
feat(huri): automatically exclude outputed .wav files
bernTP Jun 1, 2026
f9d3a93
feat(rag): improved prompt to avoid too long sentences
bernTP Jun 1, 2026
a048d9a
feat(sender): sending topic type to clients
bernTP Jun 1, 2026
2e40400
fix(rag): missing previous prompt context
bernTP Jun 2, 2026
0b39013
fix(gesture): smoother transition from sliding window + small desync …
bernTP Jun 2, 2026
818bad8
fixed(gesture): warmup now works when cold starting
bernTP Jun 2, 2026
fa4bb76
feat(huri): refactorisation on modules and removing temp features
bernTP Jun 10, 2026
93237f7
fixed(rag): qdrant is installed on all dockerfiles
bernTP Jun 10, 2026
c47bf7b
fixed(rag): removing template code for debugging
bernTP Jun 10, 2026
7da003f
add(btp): add beta test plan to the project
MatthiasvonRakowski Jun 14, 2026
6662830
fix(huri): refactored event datatypes and imports
bernTP Jun 14, 2026
867d39b
feat(huri): local ray start config with all deployments
bernTP Jun 15, 2026
689a7e4
Merge pull request #33 from Sentience-Robotics/tpm/#32/tts-gesture-rag
bernTP Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,13 @@ cython_debug/

# PyPI configuration file
.pypirc

# Helm
**/charts/*.tgz

# Others
.trash
docs

# HuRI client outputs
*.wav
2,934 changes: 2,934 additions & 0 deletions Doxyfile

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
lint:
black .
isort .
flake8 .
mypy . --check-untyped-defs

test:
pytest

check: lint test
89 changes: 87 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,88 @@
# speech-to-speech
# HuRI

1. python3.12
## Presentation

HuRI is an open-source research project focused on conversational AI for humanoid robots and virtual avatars.
HuRI provides a modular architecture that allows developers to design, implement, and run AI modules within customizable conversational pipelines defined by the user.
HuRI is launched as a multi-client server, to handle multiple client (robots) conversational requests.
The framework supports the implementation and integration of multiple AI modules, including:
Speech-to-Text (STT) and Text-to-Speech (TTS), Retrieval-Augmented Generation (RAG), Emotional analysis (EMO), Motion and gesture generation (MOV)

## Getting Started

### Prerequisites

- python 3.11.14
```sh
sudo apt install python3.11
```
- pip
```sh
sudo apt install python3-pip
```

### Installation

1. Clone the repo
```sh
git clone https://github.com/Sentience-Robotics/HuRI.git
```
2. Install pip packages
```sh
pip install -r requirements.txt
```

## Usage

#### Launch HuRI server:

```sh
serve run [config_file_path]
```

We use ray serve config file, doc [here](https://docs.ray.io/en/latest/serve/configure-serve-deployment.html).

You can also launch HuRI without config file:

```sh
python -m src.launch_huri
```

#### Launch Client:

```sh
python -m src.client --config [client_config_file_path]
```

We have custom yaml file to define modules to use and how they are initialized, template [here](config/client_template.yaml).

### Folder/Module structure

- #### root

Entrypoints:

HuRI: app.py & launch_huri.py \
Client: client.py

- #### Core

HuRI's Core classes:

client & client_senders \
events \
huri \
module \
session

- #### Modules

Modules implementation:

rag: rag's implementation \
speech_to_text: speech to text implementation, including MIC (vad), STT (speech to text) and TAG (text aggregator) \
utils: utility modules, like Sender (send event to Clients)

## Developper Documentation

HuRI's complete documentation is available [here](https://docs.sentience-robotics.fr/share/p1x9ikjkhf/p/hu-ri-documentation-f4amcndYQg).
77 changes: 41 additions & 36 deletions btp.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### **BETA TEST PLAN – TEMPLATE**
### **BETA TEST PLAN**

## **1. Project context**
HuRI is a research-driven platform that has the objective to act as a universal middleware for speech and movement for any various physical or digital human embodiments. The focus on our part is to have embodiments as human as possible, regarding the emotion aspect, and try to go beyond the uncanny valley. The goal is to create a modular ecosystem where any combination of AI can control any robot or any virtual avatar. The project focuses on a highly stable architecture, scalable cloud deployment, and innovative emotional expression through motion and voice.
Expand All @@ -7,55 +7,60 @@ HuRI is a research-driven platform that has the objective to act as a universal

| **Role Name** | **Description** |
|---------------|-----------------|
| Library Maintainer | Manages the core Python package, handles versioning, and ensures the stability of the base classes and API. |
| Module Developer | Uses the library to build and package custom plugins or specialized modules for specific use cases. |
| DevOps Engineer | Handles the containerization, orchestration, and distribution of the library across different network nodes or edge devices. |
| Client | User of the library |
| Client | Integrates the library into their own projects without concern for its internal implementation. |


## **3. Feature table**

| **Feature ID** | **User role** | **Feature name** | **Short description** |
|--------------|---------------|-------------------------|--------------------------------------|
| F1 | Everyone | Create Module | The lib allows to create a module and use it. |
| F2 | Everyone | Config file | Config file to launch different module combinations. |
| F3 | Everyone | Parallelism | HuRI can run on 1 to N machines, to split computation and balance payload. |
| F4 | Everyone | Multi-client | HuRI can be used on 1 to N robots with separated discussions. |
| F5 | Everyone | Module - MIC | User can talk to HuRI through microphone. |
| F6 | Everyone | Module - SPK | HuRI can talk to User through speakers. |
| F7 | Everyone | Module - STT | HuRI can transcribe speech into text. |
| F8 | Everyone | Module - INP | User can chat to HuRI through terminal. |
| F9 | Everyone | Module - OUT | HuRI can chat to User through terminal. |
| F10 | Everyone | Module - MOD | HuRI has 3 modes: Discussion, Inserting context & Inserting information. User can switch between modes. |
| F11 | Everyone | Module - TTS | HuRI can generate speech with text. Generate audio. |
| F12 | Everyone | Module - MOV | HuRI can generate body movement by putting points in space |
| F13 | Everyone | Module - RAG | HuRI can retrieve text from files, saved texts, old conversations, etc. |
| F14 | Everyone | Module - LLM | HuRI can generate text from a given context |
| F15 | Everyone | Module - TAN | User speech text will be analysed to understand their emotion. |
| F16 | Everyone | Module - EIN | Analysed emotion is mixed with the context. |
| F17 | Everyone | Module - AMM | HuRI will store and manage an artificial memory |
| F1 | Module Developer | Create a Module | Build and integrate modules into the library. |
| F2 | Module Developer & DevOps Engineer | Configure HuRI | Define available modules and deployement settings for HuRI. |
| F3 | Client | Configure Modules | Define and load different module combinations through a configuration file. |
| F4 | Everyone | Run in Parallel | Distribute computation across 1 to N machines to balance the payload. |
| F5 | Everyone | Handle Multi-client | Handle 1 to N simultaneous client instances with separated discussions. |
| F6 | Everyone | Detect Voice Activity | Detect when the user is speaking. |
| F7 | Everyone | Transcribe Speech | Generate text from an audio speech. |
| F8 | Everyone | Generate Speech | Generate speech audio from a given text input. |
| F9 | Everyone | Generate Body Movement | Generate body movements by placing points in space. |
| F10 | Everyone | Retrieve and Augment | Retrieve text from files, saved texts, or past conversations and generate an output. |
| F11 | Everyone | Recognise Speech Emotion | Recognise emotions from user speech. |
| F12 | Everyone | Link Emotion to Input | Link a transcript with its associated emotion. |
| F13 | Everyone | Manage Artificial Memory | Store and manage an artificial memory for HuRI. |
| F14 | Everyone | Send User Audio | Transmit user audio to the HuRI system. |
| F15 | Everyone | Send User Text | Transmit user text to the HuRI system. |
| F16 | Everyone | Receive Generated Audio | Deliver generated audio back to the user. |
| F17 | Everyone | Receive Generated Text | Deliver generated text back to the user. |
| F18 | Everyone | Store Vectorised Data | Store and retrieve vectorised data through a dedicated service. |
| F19 | Everyone | Call LLM Service | Generate a response by calling an external LLM service. |

---

## **4. Success Criteria**

| **Feature ID** | **Key success criteria** | **Indicator/metric** | **Result** |
|--------------|---------------------------------------|-----------------------|----------------|
| F1 | Creating various Modules. | 20 attempts -- expected 100% | Achieved (/20) |
| F2 | Launching different scenarios with different config files. | 5 files -- expected 100% | Achieved (/5) |
| F3 - F4 | Running 1 or several modules on 1 or several machines. | All modules running on 1 machine. All modules running on different machines. Several modules running on several machines. | Scenario achieved (/3) |
| F5 | Using a microphone and being recorded. | 10 messages recorded over 3 different devices -- expected 100% | Files recorded (/30) |
| F6 | Emitting sound through speakers. | 10 audio files played on 3 different devices -- expected 100% | Files heard (/30) |
| F7 | Transcribing speech to text correctly. | 20 spoken phrases -- expected 80% accuracy | Phrases correct (/20) |
| F8 | Sending text input via terminal. | 10 text inputs -- expected 100% | Inputs received from another module (/10) |
| F9 | Receiving text output via terminal. | 10 text outputs from another module -- expected 100% | Outputs displayed (/10) |
| F10 | Switching between the 3 modes (Discussion, Context, Info). | Switch 10 times -- expected 100% success | Switches successful (/10) |
| F11 | Generating audio file from text input. | 10 text inputs -- expected 100% generation | Files generated (/10) |
| F12 | Making human movement | human feeling* -- expected 60% | Human feedback in % |
| F13 | Retrieving context from a saved file. | 10 queries on saved text -- expected 100% retrieval | Relevant text found (/10) |
| F14 | Generating a response from a context. | 10 prompts -- expected 100% answer generation | Answers generated (/10) |
| F15 | Understanding of emotions from the interlocutor. | 10 emotion texts to analyse -- expected 60% | Emotion analysed (/10) |
| F16 | Understanding of the global emotion of the interlocutor | 10 emotional contexts to analyse -- expected 60% | 10 emotional contexts (/10) |
| F17 | Saving of important information with an update that removes information when they are old / not relevant anymore / not remembered | 10 pieces of information to save and treat over time -- expected 60% | 10 prompts to save and treat (/10) |
| F1 | Verify modules can be written and run inside HuRI. | 20 attempts -- expected 100% | Achieved (/20) |
| F2 | Check that available modules and cluster settings correspond to the configuration. | 5 configurations -- expected 100% | Achieved (/5) |
| F3 | Confirm that a specific module combination loads from a config file. | 5 files -- expected 100% | Achieved (/5) |
| F4 | Test that HuRI runs across multiple machines with computation distributed. | 1 machine / N machines | Scenario achieved (/2) |
| F5 | Verify multiple clients stay isolated with separate discussions. | 3 simultaneous instances -- expected 100% isolation | Instances isolated (/3) |
| F6 | Check that speaking and silence are correctly detected. | 10 voice samples -- expected 100% | Detections successful (/10) |
| F7 | Confirm spoken input is transcribed accurately. | 20 spoken phrases -- expected 80% accuracy | Phrases correct (/20) |
| F8 | Verify a speech audio file with human characteristic is generated from a text input accurately. | 10 text inputs -- expected 100% generation -- expected 60% human feeling* | Files generated (/10) -- Human feedback in % |
| F9 | Assess whether body movements feel human-like. | 10 movement sequences -- expected 60% human feeling | Human feedback in % |
| F10 | Check that relevant saved content is retrieved to build an answer. | 10 queries on saved text -- expected 100% retrieval | Relevant text found (/10) |
| F11 | Verify the emotion in user speech is correctly identified. | 10 emotion samples -- expected 60% accuracy | Emotions recognised (/10) |
| F12 | Confirm the detected emotion is associated with the transcript. | 10 emotional contexts -- expected 60% | Contexts linked (/10) |
| F13 | Test that information is retained, updated, and forgotten over time. | 10 pieces of info over time -- expected 60% | Prompts saved and treated (/10) |
| F14 | Verify user audio is transmitted correctly to the HuRI system. | 10 audio inputs -- expected 100% | Inputs received (/10) |
| F15 | Confirm user text is transmitted correctly to the HuRI system. | 10 text inputs -- expected 100% | Inputs received (/10) |
| F16 | Check that generated audio is correctly delivered back to the user. | 10 audio files -- expected 100% | Files heard (/10) |
| F17 | Confirm generated text is correctly delivered back to the user. | 10 text outputs -- expected 100% | Outputs displayed (/10) |
| F18 | Verify vectorised data is stored and retrieved accurately. | 10 operations -- expected 100% | Operations successful (/10) |
| F19 | Test that a coherent response is returned from the external LLM service. | 10 prompts -- expected 100% generation | Answers generated (/10) |


*Experiments will be conducted on several people and a Godspeed-based questionnaire will evaluate the human feeling
Binary file added btp.pdf
Binary file not shown.
34 changes: 0 additions & 34 deletions config/agent_input.yaml

This file was deleted.

36 changes: 0 additions & 36 deletions config/agent_io.yaml

This file was deleted.

28 changes: 28 additions & 0 deletions config/client_aux.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
huri_url: ws://localhost:8000/session

topic_list: [question]

senders:
audio:
name: audio
args:
sample_rate: 16000
frame_duration: 0.030

modules:
mic:
name: mic
args:
vad_agressiveness: 3
silence_duration: 1.5
block_duration: ${inputs.audio.args.frame_duration}
logging: INFO
stt:
name: stt
args:
language: "en"
block_duration: ${inputs.audio.args.frame_duration}
logging: INFO
tag:
name: tag
logging: INFO
32 changes: 32 additions & 0 deletions config/client_aux2.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
huri_url: ws://localhost:8000/session

topic_list: [transcript, question, rag_response]

senders:
audio:
name: audio
args:
sample_rate: 16000
frame_duration: 0.030

modules:
mic:
name: mic
args:
vad_agressiveness: 3
silence_duration: 1.5
block_duration: ${senders.audio.args.frame_duration}
stt:
name: stt
args:
language: en
block_duration: ${senders.audio.args.frame_duration}
logging: INFO
tag:
name: tag
logging: INFO
rag:
name: rag
args:
language: en
tone: formal
25 changes: 25 additions & 0 deletions config/client_auxio.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
huri_url: ws://localhost:8000/session

topic_list: [question]

senders:
text:
name: text

modules:
mic:
name: mic
args:
vad_agressiveness: 3
silence_duration: 1.5
block_duration: ${senders.audio.args.frame_duration}
logging: INFO
stt:
name: stt
args:
language: en
block_duration: ${senders.audio.args.frame_duration}
logging: INFO
tag:
name: tag
logging: INFO
Loading