mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 09:01:19 +00:00
Rename all references across the codebase: package names, imports, source IDs, directory names, docs, and configs. Co-authored-by: Ona <no-reply@ona.com>
52 lines
1.2 KiB
TypeScript
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)
|
|
}
|
|
}
|
|
|
|
|