diff --git a/backend/server.py b/backend/server.py index 21649f90..31c3d443 100644 --- a/backend/server.py +++ b/backend/server.py @@ -2,7 +2,7 @@ import os import json -from typing import List, Dict, Optional, Annotated +from typing import List, Dict, Optional, Annotated, Literal from pathlib import Path from datetime import datetime @@ -22,6 +22,10 @@ import nlp import logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + # Load ENV vars load_dotenv() @@ -92,10 +96,11 @@ class Log(BaseModel): timestamp: float ok: bool = True username: ValidatedUsername - interaction: str + event: str class GenerationLog(Log): + generation_type: Literal["Completion", "Question", "Keywords", "Structure", "RMove"] prompt: str result: str completion: Optional[str] = None @@ -126,20 +131,23 @@ async def generation(payload: GenerationRequestPayload, background_tasks: Backgr ''' To test this endpoint from curl: - $ curl -X POST -H "Content-Type: application/json" -d '{"username": "test", "gtype": "Completion_Backend", "prompt": "This is a test prompt."}' http://localhost:8000/api/generation + $ curl -X POST -H "Content-Type: application/json" -d '{"username": "test", "gtype": "Completion", "prompt": "This is a test prompt."}' http://localhost:8000/api/generation ''' should_log_doctext = should_log(payload.username) + # Sometimes gtype will have a _Backend suffix, so we strip it out + payload.gtype = payload.gtype.replace("_Backend", "") + start_time = datetime.now() - if payload.gtype == "Completion_Backend": + if payload.gtype == "Completion": result = await nlp.chat_completion(payload.prompt) - elif payload.gtype == "Question_Backend": + elif payload.gtype == "Question": result = await nlp.question(payload.prompt) - elif payload.gtype == "Keywords_Backend": + elif payload.gtype == "Keywords": result = await nlp.keywords(payload.prompt) - elif payload.gtype == "Structure_Backend": + elif payload.gtype == "Structure": result = await nlp.structure(payload.prompt) - elif payload.gtype == "RMove_Backend": + elif payload.gtype == "RMove": result = await nlp.rmove(payload.prompt) else: raise ValueError(f"Invalid generation type: {payload.gtype}") @@ -148,7 +156,8 @@ async def generation(payload: GenerationRequestPayload, background_tasks: Backgr log_entry = GenerationLog( timestamp=end_time.timestamp(), username=payload.username, - interaction=payload.gtype, + event="suggestion_generated", + generation_type=payload.gtype, prompt=payload.prompt if should_log_doctext else "", result=result.result if should_log_doctext else "", delay=(end_time - start_time).total_seconds(), @@ -160,9 +169,6 @@ async def generation(payload: GenerationRequestPayload, background_tasks: Backgr setattr(log_entry, key, value) background_tasks.add_task(make_log, log_entry) - logging.basicConfig(level=logging.INFO) - logger = logging.getLogger(__name__) - final_end_time = datetime.now() log = final_end_time - start_time logger.info(f"Total generation request operation took: {log.total_seconds()} seconds") @@ -180,7 +186,7 @@ async def reflections(payload: ReflectionRequestPayload, background_tasks: Backg log_entry = ReflectionLog( username=payload.username, - interaction="reflection", + event="reflection_generated", prompt=payload.prompt if should_log_doctext else "", paragraph=payload.paragraph if should_log_doctext else "", timestamp=end_time.timestamp(), @@ -206,7 +212,7 @@ async def chat(payload: ChatRequestPayload): # } for message in payload.messages] # make_log( # Log(username=payload.username, - # interaction="chat", + # event="chat_message", # prompt=payload.messages[-1]['content'], # ui_id=None) # ) diff --git a/backend/test_generation.sh b/backend/test_generation.sh index b4921003..1dc28814 100644 --- a/backend/test_generation.sh +++ b/backend/test_generation.sh @@ -1,2 +1,2 @@ #!/bin/bash -curl -X POST -H "Content-Type: application/json" -d '{"username": "test", "gtype": "Completion_Backend", "prompt": "This is a test prompt."}' https://textfocals.com/api/generation +curl -X POST -H "Content-Type: application/json" -d '{"username": "test", "gtype": "Completion", "prompt": "This is a test prompt."}' https://textfocals.com/api/generation diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 5b49fc70..c6ff0d46 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -3,7 +3,7 @@ export const SERVER_URL = '/api'; // Define a type for payload. Includes at least: eventType and username export interface LogPayload { username: string; - interaction: string; + event: string; [key: string]: any; } diff --git a/frontend/src/logs/index.tsx b/frontend/src/logs/index.tsx index d8cc3986..69e47e6b 100644 --- a/frontend/src/logs/index.tsx +++ b/frontend/src/logs/index.tsx @@ -7,7 +7,7 @@ import classes from './styles.module.css'; interface Log { username: string; - interaction: string; + event: string; prompt: string; result: string; completion: string; @@ -65,7 +65,7 @@ function App() { { groupedLogs[username].map((log: Log) => (
  • -

    Interaction: { log.interaction }

    +

    Event: { log.event }

    Prompt: { log.prompt }

    Result: { log.result }

    Completion: { log.completion }

    diff --git a/frontend/src/pages/draft/index.tsx b/frontend/src/pages/draft/index.tsx index b851ee71..6f665b98 100644 --- a/frontend/src/pages/draft/index.tsx +++ b/frontend/src/pages/draft/index.tsx @@ -152,7 +152,7 @@ export default function Draft() { log({ username: username, - interaction: 'Delete', + event: 'Delete', prompt: savedItems[savedItemIdx].document, result: savedItems[savedItemIdx].generation }); @@ -215,7 +215,9 @@ export default function Draft() { updateGeneration(null); log({ username: username, - interaction: type, + event: "generation_error", + // eslint-disable-next-line camelcase + generation_type: type, prompt: contextText, result: errMsg }); @@ -358,14 +360,16 @@ export default function Draft() { onClick={ async () => { log({ username: username, - interaction: `${mode}_Frontend`, + event: "request_suggestion", + // eslint-disable-next-line camelcase + generation_type: mode, prompt: beforeContext }); if (beforeContext === '') return; getGeneration( username, - `${mode}_Backend`, + mode, beforeContext ); } } diff --git a/frontend/src/pages/study/index.tsx b/frontend/src/pages/study/index.tsx index b38a0739..799f6f6e 100644 --- a/frontend/src/pages/study/index.tsx +++ b/frontend/src/pages/study/index.tsx @@ -155,7 +155,7 @@ export default function Draft() { log({ username: username, - interaction: 'Delete', + event: 'Delete', prompt: savedItems[savedItemIdx].document, result: savedItems[savedItemIdx].generation }); @@ -218,7 +218,9 @@ export default function Draft() { updateGeneration(null); log({ username: username, - interaction: type, + event: "generation_error", + // eslint-disable-next-line camelcase + generation_type: type, prompt: contextText, result: errMsg }); @@ -273,6 +275,14 @@ export default function Draft() { ); } + if (studyCondition === null) { + return ( +
    + Study condition is not set. Please check your setup. +
    + ); + } + let results = null; if (errorMsg !== '') @@ -358,11 +368,13 @@ export default function Draft() { onClick={ async () => { log({ username: username, - interaction: `${studyCondition}_Frontend`, + event: "request_suggestion", + // eslint-disable-next-line camelcase + generation_type: studyCondition, prompt: beforeContext }); if (beforeContext === '') return; - getGeneration(username, `${studyCondition}_Backend`, beforeContext); + getGeneration(username, studyCondition, beforeContext); } } > { iconFunc(studyCondition as keyof typeof visibleNameForMode) }