Files
aris/apps/aelis-backend/src/enhancement/enhance-feed.ts
Kenneth 863c298bd3 refactor: rename aris to aelis (#59)
Rename all references across the codebase: package names,
imports, source IDs, directory names, docs, and configs.

Co-authored-by: Ona <no-reply@ona.com>
2026-03-10 19:19:23 +00:00

52 lines
1.2 KiB
TypeScript

import type { FeedItem } from "@aelis/core"
import type { LlmClient } from "./llm-client.ts"
import { mergeEnhancement } from "./merge.ts"
import { buildPrompt, hasUnfilledSlots } from "./prompt-builder.ts"
/** Takes feed items, returns enhanced feed items. */
export type FeedEnhancer = (items: FeedItem[]) => Promise<FeedItem[]>
export interface FeedEnhancerConfig {
client: LlmClient
/** Defaults to Date.now — override for testing */
clock?: () => Date
}
/**
* Creates a FeedEnhancer that uses the provided LlmClient.
*
* Skips the LLM call when no items have unfilled slots.
* Returns items unchanged on LLM failure.
*/
export function createFeedEnhancer(config: FeedEnhancerConfig): FeedEnhancer {
const { client } = config
const clock = config.clock ?? (() => new Date())
return async function enhanceFeed(items) {
if (!hasUnfilledSlots(items)) {
return items
}
const currentTime = clock()
const { systemPrompt, userMessage } = buildPrompt(items, currentTime)
let result
try {
result = await client.enhance({ systemPrompt, userMessage })
} catch (err) {
console.error("[enhancement] LLM call failed:", err)
result = null
}
if (!result) {
return items
}
return mergeEnhancement(items, result, currentTime)
}
}