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
6 changes: 4 additions & 2 deletions src/knowledge/ingestion.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"""

import logging
import os
from pathlib import Path

from src.config import settings
Expand Down Expand Up @@ -91,7 +90,10 @@ def chunk_text(
chunks.append("\n\n".join(current_chunk))
# Keep overlap
overlap_text = "\n\n".join(current_chunk)
overlap_chars = overlap_text[-chunk_overlap:] if len(overlap_text) > chunk_overlap else overlap_text
if len(overlap_text) > chunk_overlap:
overlap_chars = overlap_text[-chunk_overlap:]
else:
overlap_chars = overlap_text
current_chunk = [overlap_chars] if overlap_chars.strip() else []
current_length = len(overlap_chars)

Expand Down
1 change: 0 additions & 1 deletion src/knowledge/vectorstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import json
import logging
import math
from pathlib import Path

import numpy as np
Expand Down
1 change: 0 additions & 1 deletion src/routes/courses.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import logging

from fastapi import APIRouter, HTTPException
from fastapi.responses import JSONResponse

from src.models.course import Course, GenerateCourseRequest
from src.services.generation import get_generation_service
Expand Down
12 changes: 8 additions & 4 deletions src/services/cohere_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class CohereClient:

def __init__(self, api_key: str | None = None) -> None:
self._api_key = api_key or settings.cohere_api_key
self._client = cohere.ClientV2(api_key=self._api_key)
self._client = cohere.AsyncClientV2(api_key=self._api_key)
self._embed_model = settings.cohere_embed_model
self._generate_model = settings.cohere_generate_model

Expand Down Expand Up @@ -54,7 +54,7 @@ async def generate(
messages.append({"role": "user", "content": prompt})

try:
response = self._client.chat(
response = await self._client.chat(
model=self._generate_model,
messages=messages,
max_tokens=max_tokens,
Expand Down Expand Up @@ -108,7 +108,11 @@ async def generate_json(
logger.debug("Raw response: %s", raw[:500])
raise ValueError(f"Invalid JSON response from Cohere: {exc}") from exc

async def embed(self, texts: list[str], input_type: str = "search_document") -> list[list[float]]:
async def embed(
self,
texts: list[str],
input_type: str = "search_document",
) -> list[list[float]]:
"""Generate embeddings for a list of texts.

Args:
Expand All @@ -125,7 +129,7 @@ async def embed(self, texts: list[str], input_type: str = "search_document") ->
return []

try:
response = self._client.embed(
response = await self._client.embed(
model=self._embed_model,
texts=texts,
input_type=input_type,
Expand Down
3 changes: 2 additions & 1 deletion src/services/embedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ async def embed_documents(self, texts: list[str]) -> list[list[float]]:
)
all_embeddings.extend(embeddings)

logger.info("Embedded %d documents in %d batches", len(texts), (len(texts) - 1) // batch_size + 1)
num_batches = (len(texts) - 1) // batch_size + 1
logger.info("Embedded %d documents in %d batches", len(texts), num_batches)
return all_embeddings

async def embed_query(self, query: str) -> list[float]:
Expand Down
5 changes: 4 additions & 1 deletion src/services/feedback_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ async def quick_feedback(
return f"Correct! {question.explanation}"

correct_option = question.options[question.correct_index]
user_option = question.options[user_answer] if 0 <= user_answer < len(question.options) else "N/A"
if 0 <= user_answer < len(question.options):
user_option = question.options[user_answer]
else:
user_option = "N/A"
return (
f"Incorrect. You chose '{user_option}', but the correct answer is '{correct_option}'. "
f"{question.explanation}"
Expand Down
2 changes: 1 addition & 1 deletion src/services/generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import logging

from src.knowledge.vectorstore import get_vectorstore
from src.models.course import Course, CourseModule, GenerateCourseRequest
from src.models.user_profile import UserProfile
from src.prompts.course_generation import build_course_prompt, build_module_prompt
from src.prompts.system import COURSE_SYSTEM_PROMPT
from src.services.cohere_client import get_cohere_client
from src.services.embedding import get_embedding_service
from src.knowledge.vectorstore import get_vectorstore

logger = logging.getLogger(__name__)

Expand Down
4 changes: 2 additions & 2 deletions src/services/quiz_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import logging
import uuid

from src.knowledge.vectorstore import get_vectorstore
from src.models.quiz import GenerateQuizRequest, Quiz, QuizQuestion
from src.prompts.quiz_generation import build_quiz_prompt, build_question_from_content_prompt
from src.prompts.quiz_generation import build_question_from_content_prompt, build_quiz_prompt
from src.prompts.system import QUIZ_SYSTEM_PROMPT
from src.services.cohere_client import get_cohere_client
from src.services.embedding import get_embedding_service
from src.knowledge.vectorstore import get_vectorstore

logger = logging.getLogger(__name__)

Expand Down
Loading