(db: DatabaseAdapter, llmConfig: LlmConfig, deps: SummaryServiceDeps)
| 27 | } |
| 28 | |
| 29 | function buildSummaryDeps(db: DatabaseAdapter, llmConfig: LlmConfig, deps: SummaryServiceDeps): SummaryDeps { |
| 30 | const piModel = deps.buildPiModel(llmConfig) |
| 31 | return { |
| 32 | loadMessages(segmentId, limit = 500) { |
| 33 | const data = getSegmentMessages(db, segmentId, limit) |
| 34 | if (!data) return null |
| 35 | return data.messages.map((m) => ({ senderName: m.senderName, content: m.content })) |
| 36 | }, |
| 37 | saveSummary(segmentId, summary) { |
| 38 | saveSegmentSummary(db, segmentId, summary) |
| 39 | }, |
| 40 | getSummary(segmentId) { |
| 41 | return getSegmentSummary(db, segmentId) |
| 42 | }, |
| 43 | async llmComplete(systemPrompt, userPrompt, options) { |
| 44 | const result = await completeSimple( |
| 45 | piModel, |
| 46 | { |
| 47 | systemPrompt, |
| 48 | messages: [{ role: 'user', content: [{ type: 'text', text: userPrompt }], timestamp: Date.now() }] as any, |
| 49 | }, |
| 50 | { apiKey: llmConfig.apiKey, maxTokens: options?.maxTokens, temperature: options?.temperature } |
| 51 | ) |
| 52 | return result.content |
| 53 | .filter((item): item is PiTextContent => item.type === 'text') |
| 54 | .map((item) => item.text) |
| 55 | .join('') |
| 56 | }, |
| 57 | t: (key: string) => key, |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | export async function generateSummary( |
| 62 | adapter: SessionRuntimeAdapter, |
no test coverage detected