feat: sync quick add ingestion updates
- simplify quick add source selection and fallback saving - improve description context and manual edit behavior - add extractor dimension filtering and edge explanation migration
This commit is contained in:
@@ -11,6 +11,9 @@ export interface DescriptionInput {
|
||||
channel_name?: string;
|
||||
author?: string;
|
||||
site_name?: string;
|
||||
original_filename?: string;
|
||||
pages?: number;
|
||||
text_length?: number;
|
||||
};
|
||||
dimensions?: string[];
|
||||
}
|
||||
@@ -75,10 +78,7 @@ export async function generateDescription(input: DescriptionInput): Promise<stri
|
||||
temperature: 0.3,
|
||||
});
|
||||
|
||||
const description = response.text.trim();
|
||||
|
||||
// Ensure within character limit
|
||||
const finalDescription = description.slice(0, 280);
|
||||
const finalDescription = sanitizeDescription(response.text, input);
|
||||
|
||||
console.log(`[DescriptionService] Generated: "${finalDescription}"`);
|
||||
|
||||
@@ -126,6 +126,10 @@ function buildDescriptionPrompt(input: DescriptionInput): string {
|
||||
if (input.metadata?.channel_name) lines.push(`Channel: ${input.metadata.channel_name}`);
|
||||
if (input.metadata?.author) lines.push(`Author: ${input.metadata.author}`);
|
||||
if (input.metadata?.site_name) lines.push(`Site: ${input.metadata.site_name}`);
|
||||
if (input.metadata?.source) lines.push(`Source type: ${input.metadata.source}`);
|
||||
if (input.metadata?.original_filename) lines.push(`Original filename: ${input.metadata.original_filename}`);
|
||||
if (typeof input.metadata?.pages === 'number') lines.push(`Pages: ${input.metadata.pages}`);
|
||||
if (typeof input.metadata?.text_length === 'number') lines.push(`Text length: ${input.metadata.text_length}`);
|
||||
if (creatorHint) lines.push(`Creator hint: ${creatorHint}`);
|
||||
if (publisherHint) lines.push(`Publisher hint: ${publisherHint}`);
|
||||
lines.push(`Likely user-authored: ${likelyUserAuthored ? 'yes' : 'no'}`);
|
||||
@@ -138,15 +142,19 @@ function buildDescriptionPrompt(input: DescriptionInput): string {
|
||||
Say WHAT this literally is and WHY it matters. Be concrete and specific — like you're telling a friend what this thing is in one breath.
|
||||
|
||||
RULES:
|
||||
1) Name the format: "Podcast episode where…", "Blog post arguing…", "Your note on…", "Research paper showing…", "Idea that…"
|
||||
1) Name the format only if the context clearly supports it: "Podcast episode where…", "Blog post arguing…", "Personal note capturing…", "Research paper showing…", "Resume/CV for…", "Document likely containing…", "Idea that…"
|
||||
2) Name people by role — channel/host is the creator, title figures are guests/subjects. Use the Creator hint if available.
|
||||
3) State the actual claim, finding, or insight from the content — not a vague summary of the topic.
|
||||
4) End with why it's interesting or important — one concrete phrase.
|
||||
5) ABSOLUTELY FORBIDDEN — these words will be rejected: "discusses", "explores", "examines", "talks about", "is about", "delves into", "emphasizing the need for". State things directly instead.
|
||||
6) Do NOT start with "Your note —" or "This note —". Use a concrete opener tied to the actual artifact.
|
||||
7) If the artifact type is unclear, say so explicitly using words like "likely", "appears to be", or "unclear" rather than guessing a confident format.
|
||||
|
||||
GOOD: "Karpathy blog post — AI agents make software fluid, ripping functionality from repos instead of taking dependencies. Signals the end of monolithic libraries."
|
||||
GOOD: "Dwarkesh Patel interview with Anthropic CEO Dario Amodei — argues we're nearing the end of exponential AI scaling. Key signal for what comes next."
|
||||
GOOD: "Your note — morning optimism consistently reverses to evening pessimism. Not energy — the belief itself flips. Pattern worth tracking."
|
||||
GOOD: "Personal note capturing a recurring pattern: morning optimism reverses to evening pessimism. Indicates a belief-level swing worth tracking."
|
||||
GOOD: "Resume/CV for Brad Morris outlining work in AI systems, context engineering, and RA-H. Useful as a compact record of background, projects, and expertise."
|
||||
GOOD: "Document likely related to Brad Morris's work history and AI consulting, but the exact artifact type is unclear from the available context. Still useful as a reference profile."
|
||||
BAD: "By Dario Amodei — discusses reaching the limits of exponential growth in AI, emphasizing the need for a critical perspective on future advancements."
|
||||
BAD: "This article explores ideas about how software is changing."
|
||||
|
||||
@@ -155,6 +163,24 @@ Return ONLY the description text. Nothing else.
|
||||
${lines.join('\n')}`;
|
||||
}
|
||||
|
||||
function sanitizeDescription(rawText: string, input: DescriptionInput): string {
|
||||
const singleLine = rawText
|
||||
.trim()
|
||||
.replace(/\s+/g, ' ')
|
||||
.replace(/^["']|["']$/g, '');
|
||||
|
||||
if (!singleLine) {
|
||||
return input.title.slice(0, 280);
|
||||
}
|
||||
|
||||
const noGenericPrefix = singleLine.replace(
|
||||
/^(your note|this note)\s*[—:-]\s*/i,
|
||||
'Personal note capturing '
|
||||
);
|
||||
|
||||
return noGenericPrefix.slice(0, 280);
|
||||
}
|
||||
|
||||
export const descriptionService = {
|
||||
generateDescription
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user