Skip to content

Commit 703a49c

Browse files
authored
feat: enable content generation without source for Summary (#349) (#28)
1 parent 1557f80 commit 703a49c

File tree

2 files changed

+211
-153
lines changed

2 files changed

+211
-153
lines changed

frontend/src/app/(app)/workspace/summary/page.tsx

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { usePersonaStore } from '@/lib/store/persona-store'
2525
import { useContextAvailability } from '@/lib/hooks/use-context-availability'
2626
import { getSelectContextDescription } from '@/lib/utils/context-messages'
2727
import { ContextRequirementMessage } from '@/components/context-requirement-message'
28+
import { useCourses } from '@/lib/hooks/use-courses'
2829
import type { CitationReference, Citation } from '@/lib/types/citation-types'
2930
import React from 'react'
3031

@@ -71,9 +72,10 @@ export default function SummaryPage() {
7172
setError,
7273
setSelectedModel,
7374
} = useSummaryStore()
74-
const { activePersona } = usePersonaStore()
75+
const { activePersona, selectedCourseId } = usePersonaStore()
7576
const { selectedSources } = useSourcesStore()
7677
const { getActiveContextModelName, getContextTypeLabel } = useContextAvailability()
78+
const { data: coursesData } = useCourses()
7779
const summary = summaries[id]?.summary || ''
7880
const [, setIsMobile] = useState(false)
7981
const [citations, setCitations] = useState<Citation[]>([])
@@ -94,27 +96,55 @@ export default function SummaryPage() {
9496
return false
9597
}
9698
const selectedSourcesCount = selectedSources.filter((source) => source.selected).length
97-
if (selectedSourcesCount !== 1) {
98-
toast.error('Please select exactly one source.')
99+
// Allow generation with no sources or exactly one source, but not multiple sources
100+
if (selectedSourcesCount > 1) {
101+
toast.error(
102+
'Multiple sources selected. Please select only one source or none to use course context.',
103+
)
99104
return false
100105
}
101106
return true
102107
}
103108

104109
const generateSummary = async () => {
105110
startGenerating()
111+
106112
if (!validateInputs()) {
107113
stopGenerating()
108114
return
109115
}
116+
110117
try {
111118
const modelName = getActiveContextModelName()
119+
120+
// Get course information from context
121+
const selectedCourse = coursesData?.docs.find((course) => course.id === selectedCourseId)
122+
const courseInfo = selectedCourse
123+
? {
124+
courseName: selectedCourse.name,
125+
courseDescription: selectedCourse.description,
126+
}
127+
: undefined
128+
129+
// Fallback: if no sources selected, use course description as a pseudo-source
130+
const sourcesToUse = selectedSources?.length
131+
? selectedSources
132+
: courseInfo?.courseDescription
133+
? [{ content: courseInfo.courseDescription, name: 'Course Description' }]
134+
: []
135+
112136
const response = await fetch('/api/summary', {
113137
method: 'POST',
114138
headers: { 'Content-Type': 'application/json' },
115-
body: JSON.stringify({ selectedModel: modelName, selectedSources }),
139+
body: JSON.stringify({
140+
selectedModel: modelName,
141+
selectedSources: sourcesToUse,
142+
courseInfo,
143+
}),
116144
})
145+
117146
if (!response.ok) throw new Error('Failed to generate summary')
147+
118148
const data = await response.json()
119149
setSummary(id, data.summary)
120150
setSelectedModel(modelName)
@@ -124,6 +154,7 @@ export default function SummaryPage() {
124154
console.error('Error generating summary:', error)
125155
setError('An error occurred while generating the summary.')
126156
}
157+
127158
stopGenerating()
128159
}
129160

0 commit comments

Comments
 (0)