Skip to content
This repository was archived by the owner on Jun 7, 2025. It is now read-only.
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
4 changes: 3 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
OPENAI_API_KEY=----
OPENAI_API_KEY=----

DOCUMENTS_DIR="/data/documents"
47 changes: 47 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: CI

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
test:
runs-on: ubuntu-latest

steps:
# Check out the code
- name: Checkout code
uses: actions/checkout@v2

# Set up Python
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.10'

# Install dependencies
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

# Run tests and collect coverage data
- name: Run tests and collect coverage
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY_TEST }}
run: |
coverage run -m pytest
coverage report
coverage html

# Upload coverage data to Coveralls
- name: Upload coverage to Coveralls
run: |
coveralls
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COVERALLS_TOKEN: ${{ secrets.COVERALLS_SUPPLAI_LLM_API_TOKEN }}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
# LLM-API
[![Coverage Status](https://coveralls.io/repos/github/CodeHex16/LLM-API/badge.svg)](https://coveralls.io/github/CodeHex16/LLM-API)
4 changes: 2 additions & 2 deletions app/routes/documents.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, HTTPException, File, UploadFile
from fastapi import APIRouter, Depends, HTTPException, File, UploadFile, Query
from app.services.llm_service import LLM, OpenAI
from typing import List
import os
Expand All @@ -19,7 +19,7 @@


@router.post("/upload_file")
async def upload_file(files: List[UploadFile], token: str):
async def upload_file(files: List[UploadFile] = File(...), token: str=Query(...)):
"""
Carica il file nel database vettoriale

Expand Down
2 changes: 1 addition & 1 deletion app/services/embeddings_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class EmbeddingProvider(ABC):
"""Interfaccia per i provider di embedding."""

@abstractmethod
def get_embedding_function(self):
def get_embedding_function(self): # pragma: no cover
"""Restituisce la funzione di embedding."""
pass

Expand Down
12 changes: 11 additions & 1 deletion app/services/file_manager_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ async def add_document(self, file: File, token: str):
status_code=500,
detail=f"Errore nel caricare e processare file",
)
case _:
raise HTTPException(
status_code=500,
detail=f"Errore nel caricare e processare file",
)
return False

async def delete_document(
Expand All @@ -142,7 +147,7 @@ async def delete_document(
print("INIZIO RIMOZIONE DOCUMENTO")
print("file_path:", file_path)
print("os.path.isfile(file_path):", os.path.isfile(file_path))
print("ls -la /data/documents", os.listdir("/data/documents"))
print("ls -la " + os.getenv("DOCUMENTS_DIR","/data/documents"), os.listdir(os.getenv("DOCUMENTS_DIR","/data/documents")))

if os.path.isfile(file_path) and os.path.exists(file_path):
try:
Expand Down Expand Up @@ -193,6 +198,11 @@ async def delete_document(
status_code=500,
detail=f"Errore nel caricare e processare file",
)
case _:
raise HTTPException(
status_code=500,
detail=f"Errore nel caricare e processare file",
)


class TextFileManager(FileManager):
Expand Down
9 changes: 5 additions & 4 deletions app/services/llm_response_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,16 @@ def generate_llm_response(self, question: schemas.Question) -> StreamingResponse
context = self._get_context(question.question)
# TODO: gestire array messaggi
formatted_messages = ""
context_messages = ""

print(f"question.messages: {question.messages}")
if question.messages:
if isinstance(question.messages, list):
formatted_messages = "\n".join(
#if isinstance(question.messages, list):
formatted_messages = "\n".join(
[f"{msg.sender}: {msg.content}" for msg in question.messages]
)
else:
formatted_messages = question.messages
# else: # limited by pydantic_core._pydantic_core.ValidationError
# formatted_messages = question.messages
context_messages = self._get_context(formatted_messages)

messages = [
Expand Down
4 changes: 2 additions & 2 deletions app/services/llm_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ def __init__(self, model_name: str):
self._initialize_model()

@abstractmethod
def _check_environment(self):
def _check_environment(self): # pragma: no cover
"""
Controlla le variabili d'ambiente necessarie per il funzionamento del servizio
"""
pass

@abstractmethod
def _initialize_model(self):
def _initialize_model(self): # pragma: no cover
"""
Inizializza il modello LLM
"""
Expand Down
8 changes: 4 additions & 4 deletions app/services/vector_database_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,20 @@ class VectorDatabase(ABC):
"""Interfaccia per la gestione del database vettoriale."""

@abstractmethod
def add_documents(self, documents: List[Document]):
def add_documents(self, documents: List[Document]): # pragma: no cover
pass

@abstractmethod
def search_context(self, query: str, results_number: int = 2) -> List[Document]:
def search_context(self, query: str, results_number: int = 2) -> List[Document]: # pragma: no cover
pass

# metodi ausiliari
@abstractmethod
def is_empty(self) -> bool:
def is_empty(self) -> bool: # pragma: no cover
pass

@abstractmethod
def count(self) -> int:
def count(self) -> int: # pragma: no cover
pass

# @abstractmethod
Expand Down
5 changes: 4 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@ bson
pytest
pytest-mock
pytest-asyncio
pytest-cov
httpx

pytest
pypdf
python-multipart

coverage
coveralls
Loading