Frea is an interactive terminal-based chat application powered by Google's generative AI, designed to provide seamless user interactions with advanced natural language processing capabilities. This application offers a variety of features, including multi-line input, special commands, and a customizable loading animation.
- Interactive Chat Interface: Engage in dynamic conversations with a generative AI model.
- Customization: Configure API keys, loading styles, and instruction files via
config.ini
. - Special Commands: Use commands like
exit
,clear
,reset
,print
,reconfigure
, andhelp
. - Multi-Line Input: Easily handle multi-line user inputs.
- Loading Animations: Enjoy visually appealing loading animations while waiting for responses.
- Safety Settings: Ensure content safety with predefined thresholds for harmful content categories.
- Conversation Log: Save conversation logs to a file.
- Model Switching: Easily switch between different AI models.
- Gemini API key
- Python 3.8 or later
- Required Python packages listed in
requirements.txt
-
Clone the Repository:
git clone https://github.com/1999AZZAR/frea.git cd frea
-
Create a virtual env:
python3 -m venv .venv
-
Activate the venv:
source .venv/bin/activate
-
Install Dependencies:
pip install -r requirements.txt
-
Run the code:
cd code python main.py
-
Configuration:
- On the first run, the application will prompt for the API key, loading style, and instruction file path.
- These settings will be saved in a
config.ini
file for future use.
To start the Frea application, run:
cd src
python main.py
- exit: Exit the application.
- clear: Clear the terminal screen.
- reset: Reset the chat session.
- print: Save the conversation log to a file.
- reconfigure: Reconfigure the settings.
- help: Display help information.
- model: Switch between models and services.
Upon running the application, you will see a prompt to enter your message:
╭─ User
╰─> Hello, how are you?
The application will respond after processing your input, showing a loading animation in the meantime.
To enter multi-line messages, end each line with a backslash (\
):
╭─ User
╰─> This is a multi-line \
input example.
You can run system commands by prefixing them with run
:
╭─ User
╰─> run ls -la
On the first run, the application will guide you through creating a config.ini
file:
╭─ Frea
╰─> No Configuration found. Creating configuration file.
Enter the API key: your_api_key_here
Enter the loading style (e.g., L1): L1
Enter the path to the instruction file: /path/to/instruction_file.txt
Configuration saved successfully!
You can get your own Gemini API key from here.
To update the configuration at any time, use the reconfigure
command within the application.
- Color: Contains ANSI escape codes for terminal colors.
- GeminiChatConfig: Handles configuration, API initialization, and command processing.
- GeminiChat: Main class to run the chat application.
- cursor_hide(): Hides the terminal cursor.
- cursor_show(): Shows the terminal cursor.
- remove_emojis(text): Removes emojis from text.
- run_subprocess(command): Executes a system command.
- generate_chat(): Main loop to handle user input and generate AI responses.
The application includes predefined safety settings to block harmful content categories:
- Harassment
- Hate Speech
- Sexually Explicit
- Dangerous Content
These settings can be adjusted in the gemini_safety_settings
method.
---
config:
layout: elk
---
stateDiagram
direction LR
state HandleSpecialCommand {
direction TB
[*] --> CheckCommandType
CheckCommandType --> ExitCommand:"exit"
CheckCommandType --> ResetCommand:"reset"
CheckCommandType --> ClearCommand:"clear"
CheckCommandType --> HelpCommand:"help"
CheckCommandType --> ReconfigureCommand:"recon"
CheckCommandType --> SaveCommand:"save"
CheckCommandType --> PrintCommand:"print"
CheckCommandType --> ModelCommand:"model"
ExitCommand --> [*]
ResetCommand --> [*]
ClearCommand --> [*]
HelpCommand --> [*]
ReconfigureCommand --> [*]
SaveCommand --> [*]
PrintCommand --> [*]
ModelCommand --> [*]
ExitCommand
ResetCommand
ClearCommand
HelpCommand
ReconfigureCommand
SaveCommand
PrintCommand
ModelCommand
[*] CheckCommandType
[*] }
state ProcessUserInput {
direction TB
SendMessageToAI --> DisplayResponse:Receive AI response
[*] --> SendMessageToAI
SendMessageToAI --> DisplayResponse
DisplayResponse --> [*]
SendMessageToAI
DisplayResponse
[*][*] }
[*] --> Initialization
Initialization --> ConfigurationLoaded:Load configuration
ConfigurationLoaded --> ChatInitialized:Initialize chat session
ChatInitialized --> WaitingForInput:Wait for user input
WaitingForInput --> HandleSpecialCommand:User enters special command
WaitingForInput --> HandleSubprocessCommand:User enters subprocess command
WaitingForInput --> ProcessUserInput:User enters regular input
HandleSpecialCommand --> ExitCommand:Command is "exit"
HandleSpecialCommand --> ResetCommand:Command is "reset"
HandleSpecialCommand --> ClearCommand:Command is "clear"
HandleSpecialCommand --> HelpCommand:Command is "help"
HandleSpecialCommand --> ReconfigureCommand:Command is "recon"
HandleSpecialCommand --> SaveCommand:Command is "save"
HandleSpecialCommand --> PrintCommand:Command is "print"
HandleSpecialCommand --> ModelCommand:Command is "model"
ExitCommand --> [*]:Exit application
ResetCommand --> ChatInitialized:Reset chat session
ClearCommand --> WaitingForInput:Clear terminal screen
HelpCommand --> WaitingForInput:Display help information
ReconfigureCommand --> ConfigurationLoaded:Reconfigure settings
SaveCommand --> WaitingForInput:Save chat history
PrintCommand --> WaitingForInput:Print chat history
ModelCommand --> ChatInitialized:Change AI model
HandleSubprocessCommand --> WaitingForInput:Execute subprocess command
ProcessUserInput --> SendMessageToAI:Send user input to AI
DisplayResponse --> WaitingForInput:Display response and wait for next input
note: You can incorporate Frea into your bash terminal by following this step.