Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sf-voice.sh/llms.txt

Use this file to discover all available pages before exploring further.

Esta guía te lleva desde la clave de API hasta el primer resultado de búsqueda con el SDK de TypeScript.

Instalación

pnpm add @sf-voice/media@latest

1. Crear un cliente

import { SfVoiceMedia } from "@sf-voice/media";

const client = new SfVoiceMedia({
  baseUrl: "https://api.sf-voice.com",
  apiKey: process.env.SF_VOICE_API_KEY!,
});

2. Ingerir un recurso

Usa un asset_id de tu propio sistema. Usa asset_class para agrupar recursos que deban buscarse juntos, como todos los medios de un mismo cliente.
const ingest = await client.ingest({
  source: "url",
  asset_id: "video_123",
  asset_class: "customer_acme",
  url: "https://example.com/recording.mp4",
  media_type: "video",
  types: ["video", "audio", "transcript"],
  metadata: {
    title: "product demo",
    customer_id: "acme",
  },
});
La respuesta incluye un task_id para la indexación.
{
  "asset_id": "video_123",
  "task_id": "task_abc123",
  "status": "pending"
}

3. Esperar la indexación

const task = await client.pollTask(ingest.task_id, {
  intervalMs: 2_000,
  timeoutMs: 120_000,
});

if (task.status === "failed") {
  throw new Error(task.error ?? "ingest task failed");
}

4. Buscar

Busca dentro de la misma asset_class para que los resultados se mantengan acotados al cliente o grupo previsto.
const search = await client.search({
  query: "where does the customer mention pricing?",
  asset_class: "customer_acme",
  types: ["transcript"],
  threshold: 0.7,
  limit: 10,
});

console.log(search.results);

Ejemplo completo

import { SfVoiceMedia, SfVoiceMediaError } from "@sf-voice/media";

const client = new SfVoiceMedia({
  baseUrl: "https://api.sf-voice.com",
  apiKey: process.env.SF_VOICE_API_KEY!,
});

try {
  const ingest = await client.ingest({
    source: "url",
    asset_id: "video_123",
    asset_class: "customer_acme",
    url: "https://example.com/recording.mp4",
    media_type: "video",
    types: ["video", "audio", "transcript"],
  });

  const task = await client.pollTask(ingest.task_id);

  if (task.status === "failed") {
    throw new Error(task.error ?? "ingest task failed");
  }

  const search = await client.search({
    query: "pricing",
    asset_class: "customer_acme",
    types: ["transcript"],
  });

  console.log(search.results);
} catch (error) {
  if (error instanceof SfVoiceMediaError) {
    console.error(error.code, error.status, error.message);
  }
  throw error;
}

Próximos pasos

Cómo funciona

Aprende cómo encajan la ingestión, la indexación, el sondeo de tareas y la búsqueda acotada.

SDK de TypeScript

Consulta todos los formatos de entrada y salida expuestos por el SDK.