Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
13 changes: 13 additions & 0 deletions .github/hooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/bin/bash

VERSION_FILE="app/version"

CURRENT_DATE=$(date +"%Y-%m-%d %H:%M:%S")

if jq --arg date "$CURRENT_DATE" '.last_update = $date' "$VERSION_FILE" > temp.json; then
mv temp.json "$VERSION_FILE"
git add "$VERSION_FILE"
else
echo "Error: Failed to update version file"
exit 1
fi
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
# Dependencies

- Before running install
- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
- [JQ](https://jqlang.org/download/)
- [Podman](https://podman.io/docs/installation)
- [Ollama](https://ollama.com/download)

Expand Down
10 changes: 10 additions & 0 deletions ace
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
ACE_LOGGER_VERBOSE_ENV="."


# SETUP
setup() {
echo "Setting up environment..."
git_hooks_folder=".github/hooks"
mv -r "$git_hooks_folder" ".git/hooks"
}


# STARTUP
run_tests() {
echo "Installing/Updating test dependencies..."
Expand All @@ -30,6 +38,8 @@ run_ace() {
main() {
# Store original arguments
original_args=("$@")

setup

# Initialize variables
run_tests=false
Expand Down
22 changes: 21 additions & 1 deletion app/components/controller/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
from .routes import controller_api
# DEPENDENCIES
## Third-Party
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
## Local
from .routes import root, model_provider


controller_api = FastAPI()

controller_api.include_router(root)
controller_api.include_router(model_provider)

controller_api.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:4200", "http://127.0.0.1:4200"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["*"]
)
2 changes: 2 additions & 0 deletions app/components/controller/api/routes/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .model_provider import model_provider
from .root import root
43 changes: 43 additions & 0 deletions app/components/controller/api/routes/model_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# DEPENDENCIES
## Third-Party
from fastapi import APIRouter, HTTPException
from http import HTTPStatus
from pydantic import ValidationError
## Local
from constants import APIRoutes, Defaults, Names
from logger import logger
from models.api_schemas.controller import GetLLMModelsResponse
from ..services import model_provider_service


model_provider = APIRouter()

@model_provider.get(
f"{APIRoutes.MODEL_PROVIDER}llm/model-types",
response_model=tuple[str, ...],
description=f"Get the {Names.ACE} available LLM model types"
)
async def get_llm_model_types_route() -> tuple[str, ...]:
try:
return model_provider_service.get_llm_model_types()
except ValidationError as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="LLM model types data error!")
except Exception as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)

@model_provider.get(
f"{APIRoutes.MODEL_PROVIDER}llm/models",
response_model=list[GetLLMModelsResponse],
description=f"Get the {Names.ACE} available LLM models"
)
async def get_llm_models_route() -> list[GetLLMModelsResponse]:
try:
return model_provider_service.get_llm_models()
except ValidationError as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="LLM model types data error!")
except Exception as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)
Original file line number Diff line number Diff line change
@@ -1,70 +1,59 @@
# DEPENDENCIES
## Third-Party
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi import APIRouter, HTTPException
from http import HTTPStatus
from pydantic import ValidationError
## Local
from constants import Defaults, Names
from constants import APIRoutes, Defaults, Names
from logger import logger
from models.api_schemas.controller import (
GetVersionDetailsResponse,
GetSettingsResponse, EditSettingsRequest,
GetLLMModelsResponse
GetSettingsResponse, EditSettingsRequest
)
from models.api_schemas.defaults import DefaultAPIResponse
from . import service
from ..services import root_service


controller_api = FastAPI()
controller_api.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:4200"], # Allow requests from your Angular app
allow_credentials=True,
allow_methods=["*"], # Allow all HTTP methods
allow_headers=["*"], # Allow all headers
)

root = APIRouter()

# ROUTES
@controller_api.get(
"/version",
@root.get(
f"{APIRoutes.ROOT}version",
response_model=GetVersionDetailsResponse,
description=f"Get the {Names.ACE}'s version data"
)
async def get_version_route() -> dict:
try:
return service.get_version_data()
return root_service.get_version()
except ValidationError as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="Version data error!")
except Exception as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)

@controller_api.get(
"/settings",
@root.get(
f"{APIRoutes.ROOT}settings",
response_model=GetSettingsResponse,
description=f"Get the {Names.ACE} controller settings data"
)
async def get_settings_route() -> dict:
try:
return service.get_settings_data()
return root_service.get_settings_data()
except ValidationError as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="Settings data error!")
except Exception as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)

@controller_api.post(
"/settings",
@root.post(
f"{APIRoutes.ROOT}settings",
response_model=DefaultAPIResponse,
description=f"Edit the {Names.ACE} controller settings data"
)
async def set_settings_route(updated_settings: EditSettingsRequest) -> dict:
try:
service.edit_settings_data(updated_settings=updated_settings.model_dump())
root_service.edit_settings_data(updated_settings=updated_settings.model_dump())
return DefaultAPIResponse(message="Settings data updated successfully!")
except ValidationError as error:
logger.error(error)
Expand All @@ -73,32 +62,18 @@ async def set_settings_route(updated_settings: EditSettingsRequest) -> dict:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)

@controller_api.get(
"/model-provider/model-types",
response_model=dict[str, tuple[str, ...]],
description=f"Get the {Names.ACE} available LLM model types"
)
async def get_model_types_route() -> dict[str, tuple[str, ...]]:
try:
return service.get_model_types()
except ValidationError as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="LLM model types data error!")
except Exception as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)

@controller_api.get(
"/model-provider/model-type/llm",
response_model=list[GetLLMModelsResponse],
description=f"Get the {Names.ACE} available LLM models"
@root.delete(
f"{APIRoutes.ROOT}settings",
response_model=DefaultAPIResponse,
description=f"Delete the {Names.ACE} controller settings data"
)
async def get_llm_models_route() -> list[GetLLMModelsResponse]:
async def delete_settings_route() -> dict:
try:
return service.get_llm_models()
root_service.delete_settings_data()
return DefaultAPIResponse(message="Settings data deleted successfully!")
except ValidationError as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="LLM model types data error!")
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="Settings data error!")
except Exception as error:
logger.error(error)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=Defaults.INTERNAL_SERVER_ERROR_MESSAGE)
59 changes: 0 additions & 59 deletions app/components/controller/api/service.py

This file was deleted.

4 changes: 4 additions & 0 deletions app/components/controller/api/services/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from . import (
model_provider as model_provider_service,
root as root_service
)
20 changes: 20 additions & 0 deletions app/components/controller/api/services/model_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# DEPENDENCIES
## Built-In
import json
## Local
from constants import (
Files,
ModelTypes, ThreeDModelTypes, AudioModelTypes, ImageModelTypes, LLMModelTypes, MultiModalModelTypes, RAGModelTypes, RoboticsModelTypes, VideoModelTypes
)
from models.data.initial import INTITAL_LLM_MODEL_PROVIDERS


def get_llm_model_types() -> tuple[str, ...]:
return LLMModelTypes.get_tuple()

def get_llm_models() -> list[dict]:
llm_model_providers: list[dict] = [initial_llm_model_provider.model_dump() for initial_llm_model_provider in INTITAL_LLM_MODEL_PROVIDERS]
with open(Files.CONTROLLER_LLM_MODELS, "r", encoding="utf-8") as llm_models_file:
llm_models: dict = json.loads(llm_models_file.read())
llm_model_providers.extend(llm_models)
return llm_model_providers
36 changes: 36 additions & 0 deletions app/components/controller/api/services/root.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# DEPENDENCIES
## Built-In
import json
## Local
from constants import Files
from models.config.controller import ControllerSettingsSchema


# HELPERS
def _get_settings() -> dict:
settings: dict = {}
with open(Files.CONTROLLER_SETTINGS, "r", encoding="utf-8") as settings_file:
settings = json.loads(settings_file.read())
settings = ControllerSettingsSchema(**settings).model_dump()
with open(Files.CONTROLLER_SETTINGS, "w", encoding="utf-8") as settings_file:
settings_file.write(json.dumps(settings))
return settings


# ROOT
def get_version() -> dict:
with open(Files.VERSION, "r", encoding="utf-8") as settings_file:
return json.loads(settings_file.read())

def get_settings_data() -> dict:
return _get_settings()

def edit_settings_data(updated_settings: dict):
settings: dict = _get_settings()
settings.update(updated_settings)
with open(Files.CONTROLLER_SETTINGS, "w", encoding="utf-8") as settings_file:
settings_file.write(json.dumps(settings))

def delete_settings_data():
with open(Files.CONTROLLER_SETTINGS, "w", encoding="utf-8") as settings_file:
settings_file.write(json.dumps({}))
1 change: 1 addition & 0 deletions app/components/ui/angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
],
"styles": [
"@angular/material/prebuilt-themes/azure-blue.css",
"src/theme.scss",
"src/styles.scss"
],
"scripts": []
Expand Down
14 changes: 10 additions & 4 deletions app/components/ui/src/app/app.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,14 @@
</mat-sidenav-content>
</mat-sidenav-container>

<footer class="footer">
<p>Developed by JayFalls</p>
<p>Version: v{{ version }}</p>
</footer>
@if ( uiSettings?.show_footer ) {
<div class="footer">
<p>Version: v{{ appVersionData?.version }}</p>
<p>Last Update: {{ appVersionData?.last_update }}</p>
<!-- Dark Mode Toggle -->
<button mat-icon-button (click)="toggleDarkMode()" matTooltip="Toggle Dark Mode">
<mat-icon>{{ uiSettings?.dark_mode ? 'light_mode' : 'dark_mode' }}</mat-icon>
</button>
</div>
}
</div>
Loading
Loading