Initial commit
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
from dotenv import load_dotenv, find_dotenv
|
||||
load_dotenv(find_dotenv())
|
||||
import os
|
||||
import modules.logger_tool as logger
|
||||
log_name = 'api_routers_interactive_langgraph_query'
|
||||
log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback
|
||||
logging = logger.get_logger(
|
||||
name=log_name,
|
||||
log_level=os.getenv("LOG_LEVEL", "DEBUG"),
|
||||
log_path=log_dir,
|
||||
log_file=log_name,
|
||||
runtime=True,
|
||||
log_format='default'
|
||||
)
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from typing import List
|
||||
from modules.langchain.interactive_langgraph_query import perplexity_clone_graph
|
||||
from modules.redis_config import get_cached_results, set_cached_results
|
||||
from langchain_core.messages import HumanMessage
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
class QueryRequest(BaseModel):
|
||||
query: str
|
||||
use_cache: bool = False
|
||||
|
||||
class QueryResponse(BaseModel):
|
||||
response: str
|
||||
needs_more_info: bool
|
||||
|
||||
@router.post("/query", response_model=QueryResponse)
|
||||
async def interactive_query(request: QueryRequest):
|
||||
logging.info(f"Received query: {request.query}")
|
||||
try:
|
||||
query_id = generate_random_alphanumeric()
|
||||
config = {"configurable": {"thread_id": f'{query_id}'}, "recursion_limit": 20}
|
||||
|
||||
inputs = {
|
||||
"messages": [HumanMessage(content=request.query)],
|
||||
}
|
||||
|
||||
# Check cache for existing results only if DEV_MODE is false
|
||||
use_cache = os.getenv("DEV_MODE", "true").lower() == "false"
|
||||
if use_cache:
|
||||
cache_key = f"langgraph_query:{request.query}"
|
||||
cached_result = get_cached_results(cache_key)
|
||||
if cached_result:
|
||||
logging.info(f"Found cached result for query: {request.query}")
|
||||
return cached_result
|
||||
|
||||
logging.debug("Updating state with initial message")
|
||||
perplexity_clone_graph.update_state(config, inputs)
|
||||
|
||||
logging.debug("Invoking perplexity_clone_graph")
|
||||
outputs = await perplexity_clone_graph.ainvoke(inputs, config)
|
||||
|
||||
final_response = outputs['messages'][-1].content
|
||||
needs_more_info = outputs.get('needs_more_info', False)
|
||||
|
||||
logging.info(f"Final response: {final_response}")
|
||||
logging.info(f"Needs more info: {needs_more_info}")
|
||||
|
||||
response = QueryResponse(response=final_response, needs_more_info=needs_more_info)
|
||||
|
||||
# Cache the result only if DEV_MODE is false
|
||||
if use_cache:
|
||||
set_cached_results(cache_key, response.dict())
|
||||
|
||||
return response
|
||||
except Exception as e:
|
||||
logging.error(f"Error in interactive query: {str(e)}", exc_info=True)
|
||||
raise HTTPException(status_code=500, detail=f"An error occurred during the query process: {str(e)}")
|
||||
|
||||
def generate_random_alphanumeric(length=4):
|
||||
import random
|
||||
import string
|
||||
characters = string.ascii_letters + string.digits
|
||||
return ''.join(random.choice(characters) for i in range(length))
|
||||
Reference in New Issue
Block a user