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
34 changes: 20 additions & 14 deletions backend/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -22,6 +22,10 @@
import nlp

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)



# Load ENV vars
load_dotenv()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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}")
Expand All @@ -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(),
Expand All @@ -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")
Expand All @@ -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(),
Expand All @@ -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)
# )
Expand Down
2 changes: 1 addition & 1 deletion backend/test_generation.sh
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion frontend/src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions frontend/src/logs/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import classes from './styles.module.css';

interface Log {
username: string;
interaction: string;
event: string;
prompt: string;
result: string;
completion: string;
Expand Down Expand Up @@ -65,7 +65,7 @@ function App() {
{
groupedLogs[username].map((log: Log) => (
<li key={ log.timestamp }>
<p><strong>Interaction:</strong> { log.interaction }</p>
<p><strong>Event:</strong> { log.event }</p>
<p><strong>Prompt:</strong> { log.prompt }</p>
<p><strong>Result:</strong> { log.result }</p>
<p><strong>Completion:</strong> { log.completion }</p>
Expand Down
12 changes: 8 additions & 4 deletions frontend/src/pages/draft/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ export default function Draft() {

log({
username: username,
interaction: 'Delete',
event: 'Delete',
prompt: savedItems[savedItemIdx].document,
result: savedItems[savedItemIdx].generation
});
Expand Down Expand Up @@ -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
});
Expand Down Expand Up @@ -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
);
} }
Expand Down
20 changes: 16 additions & 4 deletions frontend/src/pages/study/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export default function Draft() {

log({
username: username,
interaction: 'Delete',
event: 'Delete',
prompt: savedItems[savedItemIdx].document,
result: savedItems[savedItemIdx].generation
});
Expand Down Expand Up @@ -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
});
Expand Down Expand Up @@ -273,6 +275,14 @@ export default function Draft() {
);
}

if (studyCondition === null) {
return (
<div className="text-center text-red-500">
Study condition is not set. Please check your setup.
</div>
);
}

let results = null;

if (errorMsg !== '')
Expand Down Expand Up @@ -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) }
Expand Down
Loading