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
23 changes: 23 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,26 @@ docker-stop:

docker-remove:
-@docker rm -f $(CONTAINER_NAME) && echo "Removed Docker container." || echo "No container to remove."

# ==== Docker Compose Workflow ====
.PHONY: compose-dev

compose-dev:
docker compose -f docker-compose.dev.yml up

.PHONY: compose-down

compose-down:
docker compose -f docker-compose.dev.yml down


dev-full:
@echo Starting backend using Docker Compose...
cmd /C "start /B docker compose -f docker-compose.dev.yml up"
@timeout /T 3 > NUL
@echo Launching GUI (main.py)...
python main.py

dev-full-down:
@echo "Stopping backend (Docker Compose)..."
docker compose -f docker-compose.dev.yml down
8 changes: 7 additions & 1 deletion backend/content_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,13 @@ def generate_study_content(text: str, prompt: str = "", co_client=None) -> str:
max_tokens=600,
temperature=0.4
)
return response.generations[0].text.strip()
raw_output = response.generations[0].text.strip()

# Clean trailing non-QA lines
lines = raw_output.splitlines()
qa_lines = [line for line in lines if line.strip().startswith("Q:") or line.strip().startswith("A:")]
return "\n".join(qa_lines)


except Exception as e:
return f"[Error generating study content: {str(e)}]"
12 changes: 12 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
services:
api:
build:
context: .
dockerfile: Dockerfile
command: uvicorn backend.api:app --host 0.0.0.0 --port 8000 --reload
volumes:
- ./backend:/app/backend
env_file:
- .env
ports:
- 8000:8000
15 changes: 15 additions & 0 deletions tests/helpers/fakes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class FakeCohereResponse:
def __init__(self, text):
class Generations:
pass
gen = Generations()
gen.text = text
self.generations = [gen]


class FakeCohereClient:
def __init__(self, mock_text):
self.mock_text = mock_text

def generate(self, *args, **kwargs):
return FakeCohereResponse(self.mock_text)
16 changes: 5 additions & 11 deletions tests/test_generate_study_content_returns_qna_format.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
from backend import content_generator
from tests.helpers.fakes import FakeCohereClient


def test_generate_study_content_returns_qna_format():
class FakeResponse:
class Generations:
text = "Q: What is Python?\nA: A programming language."

generations = [Generations()]

class FakeCohereClient:
def generate(self, *args, **kwargs):
return FakeResponse()
mock_output = "Q: What is Python?\nA: A programming language."

fake_client = FakeCohereClient(mock_output)
output = content_generator.generate_study_content(
"What is Python?", co_client=FakeCohereClient()
)
"What is Python?", co_client=fake_client)

assert "Q:" in output
assert "A:" in output
18 changes: 18 additions & 0 deletions tests/test_output_contains_only_qna_lines.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from backend import content_generator
from tests.helpers.fakes import FakeCohereClient


def test_generate_study_content_strips_non_qa_lines():
mock_output = """
Q: What is Python?
A: A programming language.
Let me know if you need more help."""

fake_client = FakeCohereClient(mock_output)
output = content_generator.generate_study_content(
"text", co_client=fake_client)

for line in output.strip().splitlines():
clean_line = line.strip()
assert (clean_line.startswith("Q:")
or clean_line.startswith("A:")), f"Invalid line: {line}"