Skip to content

Context & Embeddings

Embeddings are the foundation of COORDINATOR's AI capabilities. Files, session data, and other content are converted into vector embeddings that power chat responses and training.

Concepts

Concept Description
Embedding Vector representation of content for semantic search
Context Accumulated embeddings available to the AI
Content Type Category of the source content
Football Related Whether content relates to sports data

Embedding Lifecycle

Upload → Processing → Completed/Failed
Status Description
pending Uploaded, awaiting processing
processing Being converted to embeddings
completed Ready for use
failed Processing failed

Types

From types/embedding.ts:

interface Embedding {
  id: string;
  filename: string;
  contentType: string;
  status: "pending" | "processing" | "completed" | "failed";
  partIndex?: number;
  confidence?: number;
  footballRelated?: boolean;
  caption?: string;
  detailedDescription?: string;
  metadata?: Record<string, unknown>;
  createdAt: string;
}

interface EmbeddingsResponse {
  embeddings: Embedding[];
  total: number;
}

Hooks

useEmbeddings

hooks/embeddings/use-embeddings.ts

List embeddings and upload files.

const {
  embeddings,      // Embedding[]
  total,           // number
  isLoading,
  uploadFiles      // (files: File[]) => Promise<void>
} = useEmbeddings(organizationSlug, { params });

API Calls: - GET /embedding/data?limit=100 - List embeddings - POST /embedding/upload - Upload file (FormData)

Upload Implementation:

const uploadFiles = async (files: File[]) => {
  const results = await Promise.allSettled(
    files.map(async (file) => {
      const formData = new FormData();
      formData.append("file", file);
      return fetchJSON("/embedding/upload", token, {
        method: "POST",
        body: formData
      });
    })
  );

  // Report success/failure for each file
  results.forEach((result, i) => {
    if (result.status === "fulfilled") {
      toast.success(`Uploaded ${files[i].name}`);
    } else {
      toast.error(`Failed: ${files[i].name}`);
    }
  });

  queryClient.invalidateQueries(["embeddings"]);
};

useEmbedding

hooks/embeddings/use-embedding.ts

Manage a single embedding with media access.

const {
  embedding,       // Embedding
  mediaUrl,        // string (blob URL for preview)
  isLoading,
  isPolling,       // Still processing
  deleteEmbedding  // () => Promise<void>
} = useEmbedding(organizationSlug, embeddingId);

API Calls: - GET /embedding/search-by-file?filename={id}&limit=1 - Find embedding - GET /embedding/{id}/media - Fetch media blob - DELETE /embedding/{id} - Delete embedding

Polling:

// Polls every 5s while status is processing
refetchInterval: embedding?.status === "processing" ? 5000 : false

useSearchEmbeddings

hooks/embeddings/use-search-embedding.ts

Search embeddings with various strategies.

const { embeddings, isLoading } = useSearchEmbeddings(organizationSlug, {
  searchQuery,     // Text search
  filename,        // Filename search
  contentType,     // Filter by type
  footballRelated, // Filter by sports relevance
  limit
});

API Calls: - GET /embedding/search?query={text} - Semantic text search - GET /embedding/search-by-file?filename={name} - Filename match - GET /embedding/search-similar-content?contentType={type} - Similar content

Pages

Context Overview

/portal/[slug]/[teamID]/context

Tutorial cards introducing the context workflow: 1. Upload files 2. Process embeddings 3. Use in chat 4. Train models

Upload Files

/portal/[slug]/[teamID]/context/upload

File upload interface: - Drag-and-drop zone - File type validation - Progress indicators

Components: - FileDropzone - Drop area - FileUploadPopover - Upload trigger - SelectedFilesList - Pending uploads

Manage Embeddings

/portal/[slug]/[teamID]/context/manage

Tabbed interface for browsing embeddings:

Tab Description
All Embeddings Full list with pagination
Text Search Semantic search by query
File Search Search by filename
Similar Content Find by content type

Embedding Detail

/portal/[slug]/[teamID]/context/manage/[embeddingID]

Displays: - Media preview (image/video/audio/PDF) - Metadata fields: - Content type - Part index - Confidence score - Football related flag - Caption - Detailed description - Raw metadata JSON - Delete action

Supported File Types

The system processes various content types:

Category Types
Images PNG, JPEG, GIF, WebP
Video MP4, WebM, MOV
Audio MP3, WAV, M4A
Documents PDF, TXT, Markdown
Data JSON, CSV

Components

FileDropzone

components/upload/file-dropzone.tsx

Drag-and-drop upload zone:

<FileDropzone
  onFilesSelected={(files) => setSelectedFiles(files)}
  accept={{ "image/*": [], "video/*": [], "application/*": [] }}
/>

EmbeddingsTable

components/tables/embeddings/embeddings-table.tsx

Data table with: - Filename, status, content type - Created date - Actions (view, delete)

EmbeddingCard

components/cards/embedding-card.tsx

Card view for embedding preview.

Media Preview

The embedding detail page renders media based on content type:

const renderMedia = () => {
  if (!mediaUrl) return null;

  if (contentType?.startsWith("image/")) {
    return <img src={mediaUrl} alt={filename} />;
  }
  if (contentType?.startsWith("video/")) {
    return <video src={mediaUrl} controls />;
  }
  if (contentType?.startsWith("audio/")) {
    return <audio src={mediaUrl} controls />;
  }
  if (contentType === "application/pdf") {
    return <iframe src={mediaUrl} />;
  }
  return <a href={mediaUrl} download>Download</a>;
};

Integration with Sessions

Session timelines can be embedded:

// From session detail page
const handleEmbedTimeline = async () => {
  const { uploadFiles } = useEmbeddings(orgSlug);

  // Convert timeline items to files
  const files = timeline.map(item => 
    new File([JSON.stringify(item.data)], `${item.id}.json`)
  );

  await uploadFiles(files);
};

Integration with Chat

Embeddings provide context for AI chat:

  1. User sends message
  2. Backend searches embeddings semantically
  3. Relevant context injected into prompt
  4. AI responds with context awareness

Integration with Training

Training jobs use embeddings as context:

  1. Select embeddings for training set
  2. Configure training parameters
  3. Model fine-tuned on selected context
  4. Deployed model uses new knowledge