Skip to content

TwelveLabs

Nuget package dotnet License: MIT Discord

Features 🔥

  • Fully generated C# SDK based on official TwelveLabs OpenAPI specification using AutoSDK
  • Same day update to support new features
  • Updated and supported automatically if there are no breaking changes
  • All modern .NET features - nullability, trimming, NativeAOT, etc.
  • Support .Net Framework/.Net Standard 2.0

Usage

1
2
3
using TwelveLabs;

using var client = new TwelveLabsClient(apiKey);

List Indexes

Shows how to list video indexes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
using var client = new TwelveLabsClient(apiKey);

// List all video indexes in your account.
var response = await client.SubpackageIndexes.ListAsync(
    xApiKey: apiKey);

// The response contains a paginated list of indexes.
foreach (var index in response.Data!)
{
    Console.WriteLine($"Index: {index.IndexName} (ID: {index.Id}, Videos: {index.VideoCount})");
}

Search Videos

Shows how to search across indexed videos using a text query.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using var client = new TwelveLabsClient(apiKey);

// Retrieve the first index to use for searching.
var indexes = await client.SubpackageIndexes.ListAsync(
    xApiKey: apiKey);
var indexId = indexes.Data?.FirstOrDefault()?.Id
    ?? throw new AssertInconclusiveException("No indexes found. Create an index and upload videos first.");

// Search for video segments matching a text query using visual search.
var results = await client.SubpackageSearch.CreateAsync(
    xApiKey: apiKey,
    indexId: indexId,
    queryText: "a person walking",
    searchOptions: [SearchPostRequestBodyContentMultipartFormDataSchemaSearchOptionsItems.Visual]);

// The response contains matching video clips with timestamps and relevance ranking.
foreach (var item in results.Data!)
{
    Console.WriteLine($"Video: {item.VideoId}, Start: {item.Start}s, End: {item.End}s, Rank: {item.Rank}");
}

Analyze Video

Shows how to generate text from video content using open-ended analysis.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using var client = new TwelveLabsClient(apiKey);

// Retrieve an indexed video to analyze.
var indexes = await client.SubpackageIndexes.ListAsync(
    xApiKey: apiKey);
var indexId = indexes.Data?.FirstOrDefault()?.Id
    ?? throw new AssertInconclusiveException("No indexes found. Create an index and upload videos first.");

var assets = await client.SubpackageIndexesSubpackageIndexesIndexedAssets.ListAsync(
    indexId: indexId,
    xApiKey: apiKey);
var videoId = assets.Data?.FirstOrDefault()?.Id
    ?? throw new AssertInconclusiveException("No indexed assets found in the index.");

// Generate a summary of the video using open-ended analysis with streaming disabled.
var response = await client.AnalyzeAsync(
    xApiKey: apiKey,
    videoId: videoId,
    prompt: "Provide a brief summary of this video, including the main topic and key points.",
    stream: false);

// The non-streaming response contains the generated text and token usage.
var result = response.NonStreamAnalyzeResponse;
Console.WriteLine($"Generated text: {result!.Data}");
Console.WriteLine($"Finish reason: {result.FinishReason}");

Text Embedding

Shows how to generate text embeddings using the MEAI IEmbeddingGenerator interface.

1
2
3
4
5
6
7
using var client = new TwelveLabsClient(apiKey);
client.WithApiKey(apiKey);

// Use the MEAI IEmbeddingGenerator interface for text embeddings.
IEmbeddingGenerator<string, Embedding<float>> generator = client;

var metadata = generator.GetService<EmbeddingGeneratorMetadata>();

Support

Priority place for bugs: https://github.com/tryAGI/TwelveLabs/issues
Priority place for ideas and general questions: https://github.com/tryAGI/TwelveLabs/discussions
Discord: https://discord.gg/Ca2xhfBf3v

Acknowledgments

JetBrains logo

This project is supported by JetBrains through the Open Source Support Program.