Handler MCP: wiki_enrich_related
Propósito
Enriquecer el campo related[] (referencias semánticas a otras páginas wiki) de una o más páginas wiki usando candidatos basados en embeddings semánticos. Utiliza Vectorize (Workers AI) para buscar pages temáticamente relevantes.
Firma y entrada
async function wikiEnrichRelated(
args: {
limit?: number, // máx páginas a procesar (defecto 10, cap 50)
dry_run?: boolean, // si true, solo reporta sin escribir (defecto true)
where?: string, // cláusula WHERE SQL para filtrar targets (defecto: 'status = "active"')
actor?: string, // quién dispara la pasada; por defecto 'agent-enrich' (usado en el log de coste)
},
db: D1Database,
env: Env
): Promise<string>
Args:
limit: número máximo de páginas wiki a procesar. Capped en 50.dry_run: sitrue(por defecto seguro), retorna sugerencias sin modificar D1 ni el repositorio. Sifalse, escriberelated[]en D1 y pushea cambios al MD (via Git API).where: cláusula WHERE SQL para seleccionar páginas target. Defecto:status = 'active'. Ej:"type = 'feature_page'"para solo features.actor: identifica quién dispara la pasada (humano o agente). Se usa comoactorde la fila que se deja enbib_wiki_log. Defecto'agent-enrich'.
Dependencias del entorno (Env):
ANTHROPIC_API_KEY: requerido para Haiku (selección final de candidatos + grounding).AI(Workers AI binding): requerido paraembedTextsysearchChunks(Vectorize).D1Database: acceso abib_wiki_pagesy chunks de wiki (D1).GITHUB_TOKEN: sidry_run=false, para escribir al repo.
Lógica principal
Para cada página target (t en targets):
-
Embed y search:
- Vectoriza el título (
t.title) conembedTexts(env.AI, [t.title]). - Busca chunks wiki similares:
searchChunks(env, vec, 18, { sourceType: 'doc' }). - Extrae slugs únicos del
sourcePathde cada chunk (regex:/^(?:src\/content\/)?wiki\/(.+?)\.md$/). - Evita duplicar el slug de la propia página (
seenSet).
- Vectoriza el título (
-
Validación en DB:
- Consulta
bib_wiki_pagespara obtener slug + title de candidatos válidos (status=‘active’). - Limita a
MAX_CANDIDATES=25primeros.
- Consulta
-
Selección final (Haiku):
- Si hay candidatos, llama a Haiku con el título + candidatos.
- Haiku elige 2-4 candidatos mejores (criterio: relevancia temática + complementariedad).
- Retorna
suggested: [{ slug, title }, ...].
-
Escritura (solo si
dry_run=false):- Actualiza D1: línea
related:en el YAML front-matter del MD. - Refresca sección ”## Véase también”.
- Actualiza D1: línea
Registro de coste (bib_wiki_log)
Desde el 10-09-2026 (commit b7bfcf74, #169 — hallazgo del verificador en Opus de la
regeneración del Atlas, ficha ws3), cada pasada de wiki_enrich_related deja una fila en
bib_wiki_log. Antes era la única tool de la wiki que gastaba IA (llamadas a Haiku) sin dejar
rastro de coste, a diferencia de wiki_curator_review, bib_run_drift_check_batch o
wiki_lint_contradictions, que sí lo hacían.
- Se acumulan
input_tokens/output_tokensde todas las llamadas a Haiku de la pasada — una fila por pasada, no una fila por página procesada. operation:'query'sidry_run=true,'update'sidry_run=false.actor:args.actorsi se pasa; si no,'agent-enrich'.cost_usd: calculado conhaikuCostUsd(totalInput, totalOutput)— también se añade a la respuesta JSON de la tool.- Si el
INSERTenbib_wiki_logfalla, no rompe la pasada: se añade un resultado{slug: '(log)', error: 'wiki_log_error:...'}a la lista deresults, peroprocessed/appliedse devuelven igual. - La fila solo se escribe si hubo al menos una llamada a Haiku (
haikuCalls > 0); una pasada sin targets no deja fila.
Respuesta
{
"processed": 5,
"applied": 2,
"dry_run": true,
"cost_usd": 0.00034,
"total_tokens": 1240,
"results": [ ... ]
}
Véase también
- [[feature—biblioteca—candidatos-semanticos-vectorize]]
- [[entity—functions—service—archivo-core]]
- [[concept—infra—vectorize]]
- [[concept—biblioteca—embedding]]
- [[concept—saas—supercontext]]