Jina
Features 🔥
Fully generated C# SDK based on official Jina 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
Microsoft.Extensions.AI IEmbeddingGenerator support
Usage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 using Jina ;
using var api = new JinaApi ( apiKey );
var response = await api . Embeddings . CreateEmbeddingAsync ( new TextEmbeddingInput
{
Model = "jina-clip-v1" ,
Input = new List < ApiSchemasEmbeddingTextDoc >
{
new ()
{
Text = "Hello, world!" ,
}
}
});
Console . WriteLine ( $"[{string.Join(" , ", response.Data[0].Embedding ?? [])}]" );
Microsoft.Extensions.AI
The SDK implements IEmbeddingGenerator :
using Jina ;
using Microsoft.Extensions.AI ;
IEmbeddingGenerator < string , Embedding < float >> generator = new JinaApi ( apiKey );
var embeddings = await generator . GenerateAsync (
["Hello, world!"] ,
new EmbeddingGenerationOptions { ModelId = "jina-embeddings-v3" });
Console . WriteLine ( $"Embedding dimension: {embeddings[0].Vector.Length}" );
Create Embedding
using var client = new JinaClient ( apiKey );
var response = await client . SearchFoundationModels . EmbeddingsAsync (
new EmbeddingsV2Request
{
Model = EmbeddingsV2RequestModel . JinaEmbeddingsV2BaseEn ,
Input = "Hello, world!" ,
});
var embedding = response . Data . Value1 ! [ 0 ]. Embedding . Value2 ;
Console . WriteLine ( $"[{string.Join(" , ", embedding ?? [])}]" );
Embedding Generator Batch Texts
1
2
3
4
5
6
7
8
9
10
11
12
13 using var client = new JinaClient ( apiKey );
IEmbeddingGenerator < string , Embedding < float >> generator = client ;
var embeddings = await generator . GenerateAsync (
["Hello", "World", "Test"] ,
new EmbeddingGenerationOptions
{
ModelId = "jina-embeddings-v3" ,
});
foreach ( var embedding in embeddings )
{
}
Embedding Generator Custom Dimensions
using var client = new JinaClient ( apiKey );
IEmbeddingGenerator < string , Embedding < float >> generator = client ;
var embeddings = await generator . GenerateAsync (
["Hello, world!"] ,
new EmbeddingGenerationOptions
{
ModelId = "jina-embeddings-v3" ,
Dimensions = 256 ,
});
using var client = CreateTestClient ();
IEmbeddingGenerator < string , Embedding < float >> generator = client ;
var metadata = generator . GetService < EmbeddingGeneratorMetadata > ();
Embedding Generator Get Service Returns Null For Unknown Key
using var client = CreateTestClient ();
IEmbeddingGenerator < string , Embedding < float >> generator = client ;
var result = generator . GetService < EmbeddingGeneratorMetadata > ( serviceKey : "unknown" );
Embedding Generator Get Service Returns Self
using var client = CreateTestClient ();
IEmbeddingGenerator < string , Embedding < float >> generator = client ;
var self = generator . GetService < JinaClient > ();
Embedding Generator Single Text
using var client = new JinaClient ( apiKey );
IEmbeddingGenerator < string , Embedding < float >> generator = client ;
var embeddings = await generator . GenerateAsync (
["Hello, world!"] ,
new EmbeddingGenerationOptions
{
ModelId = "jina-embeddings-v3" ,
});
Multimodal Embeddings Mixed Text And Image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 using var client = new JinaClient ( apiKey );
var items = new AnyOf < string , TextDoc , ImageDoc > []
{
"A beautiful sunset over the ocean" ,
new ImageDoc { Image = "https://i.ibb.co/nQNGqL0/beach1.jpg" },
};
var embeddings = await client . GenerateMixedEmbeddingsAsync (
items ,
new EmbeddingGenerationOptions
{
Dimensions = 256 ,
});
foreach ( var embedding in embeddings )
{
}
Multimodal Embeddings Single Image
using var client = new JinaClient ( apiKey );
var embeddings = await client . GenerateImageEmbeddingsAsync (
["https://i.ibb.co/nQNGqL0/beach1.jpg"] ,
new EmbeddingGenerationOptions
{
Dimensions = 256 ,
});
Rerank
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
26 using var client = new JinaClient ( apiKey );
RerankingResponse output = await client . SearchFoundationModels . RerankAsync (
new TextRerankerRequest
{
Model = TextRerankerRequestModel . JinaRerankerV2BaseMultilingual ,
Query = "Organic skincare products for sensitive skin" ,
TopN = 3 ,
Documents =
[
"Organic skincare for sensitive skin with aloe vera and chamomile.",
"New makeup trends focus on bold colors and innovative techniques.",
"Bio-Hautpflege für empfindliche Haut mit Aloe Vera und Kamille.",
"Neue Make-up-Trends setzen auf kräftige Farben und innovative Techniken.",
"Cuidado de la piel orgánico para piel sensible con aloe vera y manzanilla.",
"Las nuevas tendencias de maquillaje se centran en colores vivos y técnicas innovadoras.",
] ,
});
foreach ( RerankingResult result in output . Results )
{
Console . WriteLine ( $ @"
Index: {result.Index}
Document: {result.Document?.Value1 ?? result.Document?.Value2?.Text}
RelevanceScore: {result.RelevanceScore}" );
}
Support
Priority place for bugs: https://github.com/tryAGI/Jina/issues
Priority place for ideas and general questions: https://github.com/tryAGI/Jina/discussions
Discord: https://discord.gg/Ca2xhfBf3v
Acknowledgments
This project is supported by JetBrains through the Open Source Support Program .