Skip to content

Commit d992cf5

Browse files
committed
Create jupyter notebook to show how to use the module. Also, change the folder name of report to veugen and cerate docs folder
1 parent c67c27b commit d992cf5

File tree

10 files changed

+481
-34
lines changed

10 files changed

+481
-34
lines changed
90.6 KB
Loading
3.02 MB
Loading

docs/vuegen_demo.ipynb

Lines changed: 307 additions & 0 deletions
Large diffs are not rendered by default.

report/main.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

vuegen/main.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from streamlit_reportview import StreamlitReportView
2+
from quarto_reportview import QuartoReportView, ReportFormat
3+
from metadata_manager import MetadataManager
4+
from report import ReportType
5+
from utils import assert_enum_value
6+
7+
if __name__ == '__main__':
8+
# Load report object and metadata from YAML file
9+
yaml_manager = MetadataManager()
10+
report, report_metadata = yaml_manager.load_report_metadata('./report_metadata_micw2graph.yaml')
11+
12+
# Create report view
13+
doc_report = QuartoReportView(report_metadata['report']['id'],
14+
report_metadata['report']['name'],
15+
report=report,
16+
report_type = assert_enum_value(ReportType, report_metadata['report']['report_type'], report.logger),
17+
report_format = assert_enum_value(ReportFormat, report_metadata['report']['report_format'], report.logger),
18+
columns=None)
19+
doc_report.generate_report()
20+
doc_report.run_report()
21+
22+
# st_report = StreamlitReportView(report_metadata['report']['id'],
23+
# report_metadata['report']['name'],
24+
# report=report,
25+
# report_type = assert_enum_value(ReportType, report_metadata['report']['report_type'], report.logger),
26+
# columns=None)
27+
# st_report.generate_report()
28+
# st_report.run_report()
29+

report/metadata_manager.py renamed to vuegen/metadata_manager.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
import yaml
33
import report as r
44
import logging
5-
from enum import StrEnum
6-
from typing import Type
7-
from helpers.utils import get_logger, assert_enum_value
5+
from utils import get_logger, assert_enum_value
86

97
class MetadataManager:
108
"""

report/quarto_reportview.py renamed to vuegen/quarto_reportview.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import report as r
44
from enum import StrEnum, auto
55
from typing import List, Optional
6-
from helpers.utils import create_folder
6+
from utils import create_folder
77

88
class ReportFormat(StrEnum):
99
HTML = auto()

report/report.py renamed to vuegen/report.py

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import networkx as nx
77
import pandas as pd
88
import logging
9+
import requests
910
import matplotlib.pyplot as plt
1011
from pyvis.network import Network
1112

@@ -343,6 +344,147 @@ def __init__(self, id: int, name: str, file_path: str, title: str=None, caption:
343344
Initializes a DataFrame object.
344345
"""
345346
super().__init__(id, name, file_path, component_type=ComponentType.MARKDOWN, title=title, caption=caption, logger=logger)
347+
348+
class APICall(Component):
349+
"""
350+
A component for interacting with APIs in a report.
351+
352+
Attributes
353+
----------
354+
api_url : str
355+
The URL of the API to interact with.
356+
headers : Optional[dict]
357+
Headers to include in the API request (default is None).
358+
params : Optional[dict]
359+
Query parameters to include in the API request (default is None).
360+
"""
361+
def __init__(self, id: int, name: str, file_path: str, api_url: str,
362+
title: str = None, caption: str = None, logger: Optional[logging.Logger] = None,
363+
headers: Optional[dict] = None, params: Optional[dict] = None):
364+
super().__init__(id, name, file_path, component_type=ComponentType.MARKDOWN,
365+
title=title, caption=caption, logger=logger)
366+
self.api_url = api_url
367+
self.headers = headers or {}
368+
self.params = params or {}
369+
370+
def make_api_request(self, method: str = "GET", payload: Optional[dict] = None) -> Optional[dict]:
371+
"""
372+
Initiates an API request.
373+
374+
Parameters
375+
----------
376+
method : str, optional
377+
HTTP method to use for the request (default is "GET").
378+
payload : Optional[dict], optional
379+
The request payload for POST or PUT methods (default is None).
380+
381+
Returns
382+
-------
383+
response : Optional[dict]
384+
The JSON response from the API, or None if the request fails.
385+
"""
386+
try:
387+
self.logger.info(f"Making {method} request to API: {self.api_url}")
388+
response = requests.request(method, self.api_url, headers=self.headers, params=self.params, json=payload)
389+
response.raise_for_status()
390+
self.logger.info(f"Request successful with status code {response.status_code}.")
391+
return response.json()
392+
except requests.exceptions.RequestException as e:
393+
self.logger.error(f"API request failed: {e}")
394+
return None
395+
396+
def parse_api_response(self, response: Optional[dict], key: Optional[str] = None) -> Optional[any]:
397+
"""
398+
Extracts and processes data from the API response.
399+
400+
Parameters
401+
----------
402+
response : Optional[dict]
403+
The response from the API.
404+
key : Optional[str], optional
405+
A specific key to retrieve from the response (default is None).
406+
407+
Returns
408+
-------
409+
result : Optional[any]
410+
The extracted data from the response, or None if the key is not found.
411+
"""
412+
if not response:
413+
self.logger.error("No response to parse.")
414+
return None
415+
416+
try:
417+
if key:
418+
self.logger.info(f"Parsing response for key: {key}")
419+
return response.get(key, None)
420+
self.logger.info("Returning full API response.")
421+
return response
422+
except Exception as e:
423+
self.logger.error(f"Failed to parse API response: {e}")
424+
return None
425+
426+
class RAG(APICall):
427+
"""
428+
A specialized component for interacting with Retrieval-Augmented Generation APIs.
429+
430+
Attributes
431+
----------
432+
model_id : str
433+
The ID of the language model to use for retrieval.
434+
top_k : int
435+
The number of results to retrieve (default is 5).
436+
"""
437+
def __init__(self, id: int, name: str, file_path: str, api_url: str, model_id: str,
438+
top_k: int = 5, title: str = None, caption: str = None, logger: Optional[logging.Logger] = None,
439+
headers: Optional[dict] = None, params: Optional[dict] = None):
440+
super().__init__(id, name, file_path, api_url, title=title, caption=caption,
441+
logger=logger, headers=headers, params=params)
442+
self.model_id = model_id
443+
self.top_k = top_k
444+
445+
def generate_query(self, user_input: str) -> dict:
446+
"""
447+
Constructs the payload for a RAG query.
448+
449+
Parameters
450+
----------
451+
user_input : str
452+
The input query for retrieval.
453+
454+
Returns
455+
-------
456+
payload : dict
457+
The payload for the RAG API request.
458+
"""
459+
self.logger.info(f"Generating query payload for input: {user_input}")
460+
return {
461+
"model_id": self.model_id,
462+
"input": user_input,
463+
"top_k": self.top_k
464+
}
465+
466+
def get_retrieved_documents(self, user_input: str) -> Optional[list]:
467+
"""
468+
Sends a RAG query and retrieves the resulting documents.
469+
470+
Parameters
471+
----------
472+
user_input : str
473+
The input query for retrieval.
474+
475+
Returns
476+
-------
477+
documents : Optional[list]
478+
A list of retrieved documents, or None if the request fails.
479+
"""
480+
payload = self.generate_query(user_input)
481+
response = self.make_api_request(method="POST", payload=payload)
482+
documents = self.parse_api_response(response, key="retrieved_documents")
483+
if documents:
484+
self.logger.info(f"Retrieved {len(documents)} documents.")
485+
else:
486+
self.logger.warning("No documents retrieved.")
487+
return documents
346488

347489
@dataclass
348490
class Subsection:

report/streamlit_reportview.py renamed to vuegen/streamlit_reportview.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import os
33
import subprocess
44
from typing import List, Optional
5-
from helpers.utils import create_folder
5+
from utils import create_folder
66

77
class StreamlitReportView(r.WebAppReportView):
88
"""
File renamed without changes.

0 commit comments

Comments
 (0)