Volver a la wiki

Oráculo — Deduplicación de chips de sources por path único

Resumen

El componente SearchInline del Oráculo mostraba múltiples chips de source cuando el backend recuperaba varios chunks del mismo archivo. Edu reportó que “todos los chips abren README.md” — visualmente parecía links rotos porque 4-5 chips tenían títulos distintos (Claude Method · Componentes (1/2), Claude Method · Principios…) pero todos navegaban al mismo documento.

La causa raíz no era un bug de backend: el retrieval RAG funciona correctamente enviando 5 secciones del README al modelo para contexto. El problema era puramente de presentación en UI.

Solución implementada

Nueva función dedupeSources(sources: OracleSource[]) añadida en SearchInline.tsx (sesión s73):

function dedupeSources(sources: OracleSource[]): Array<{
  title: string;
  path: string | null;
  href: string | null;
  count: number;
}> {
  const byKey = new Map<string, { title: string; path: string | null; href: string | null; count: number }>();
  for (const s of sources) {
    const key = s.path || s.title;           // agrupa por path; fallback a title
    const existing = byKey.get(key);
    if (existing) { existing.count++; continue; }
    const cleanTitle = s.title.split(' · ')[0].trim() || s.title; // quita sufijo " · <sección>"
    byKey.set(key, { title: cleanTitle, path: s.path, href: sourceToHref(s.path), count: 1 });
  }
  return Array.from(byKey.values());
}

Comportamiento antes/después

AntesDespués
[Claude Method · Componentes (1/2)][Claude Method (5 secciones)]
[Claude Method · Componentes](fusionado)
[Claude Method · Principios](fusionado)
[Claude Method · Quick Start](fusionado)
[Claude Method · Quick Start](fusionado)

Cuando count === 1, el label es el título limpio sin sufijo. Cuando count > 1, se añade (N secciones).

Alcance del cambio

Lógica de agrupación

La clave de agrupación es s.path || s.title:

El title limpio se extrae tomando solo la parte anterior al separador ·, que es la convención usada en el backend para componer títulos de chunks (<doc_title> · <heading>).

Contexto histórico

Véase también

Subir