Skip to content

Commit 4386a66

Browse files
committed
Various cleanup and small improvements to mtmd:
- Moved `CountPositions`/`CountTokens` to be instance methods on `SafeMtmdInputChunks` - Better exceptions in `LoadFromFile`/`LoadFromFileAsync` (checking for file readability etc) - Using safe handles instead of raw pointers in many places. In turn removed lots of uses of `DangerousGetHandle()` - Accepting spans instead of arrays in `FromRgbBytes`/`FromAudioSamples` - Added more doc comments on mtmd methods
1 parent e4fd20b commit 4386a66

9 files changed

Lines changed: 253 additions & 337 deletions

File tree

LLama.Unittest/MtmdWeightsTests.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public MtmdWeightTests()
3030

3131
_mediaMarker = _mtmdParams.MediaMarker ?? throw new InvalidOperationException("MTMD media marker unavailable.");
3232

33-
_mtmdWeights = MtmdWeights.LoadFromFile(Constants.MtmdMmpPath, _llamaWeights, _mtmdParams);
33+
_mtmdWeights = Task.Run(async () => await MtmdWeights.LoadFromFileAsync(Constants.MtmdMmpPath, _llamaWeights, _mtmdParams)).Result;
3434
_context = _llamaWeights.CreateContext(@params);
3535
}
3636

@@ -71,6 +71,16 @@ private void AssertChunksEvaluate(SafeMtmdInputChunks chunks)
7171
Assert.True(nPast > 0);
7272
}
7373

74+
[Fact, Trait("Category", "NoCI")]
75+
public void BasicPropertyChecks()
76+
{
77+
Assert.False(_mtmdWeights.SupportsAudio);
78+
Assert.True(_mtmdWeights.SupportsVision);
79+
Assert.False(_mtmdWeights.UsesMRope);
80+
Assert.True(_mtmdWeights.UsesNonCausalAttention);
81+
Assert.Equal(-1, _mtmdWeights.AudioBitrate);
82+
}
83+
7484
[Fact,Trait("Category", "NoCI")]
7585
public void EmbedImageAsFileName()
7686
{
@@ -125,8 +135,8 @@ public void TokenizeProvidesChunkMetadata()
125135

126136
Assert.True(imageChunks > 0);
127137
Assert.True(totalTokens > 0);
128-
Assert.Equal(totalTokens, _mtmdWeights.CountTokens(chunks));
129-
Assert.Equal(totalPositions, _mtmdWeights.CountPositions(chunks));
138+
Assert.Equal(totalTokens, chunks.CountTokens());
139+
Assert.Equal(totalPositions, chunks.CountPositions());
130140
Assert.True(_mtmdWeights.SupportsVision);
131141
Assert.False(_mtmdWeights.SupportsAudio);
132142

LLama/Batched/Conversation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public static MtmdChunkSequence Create(SafeMtmdInputChunks chunks, MtmdWeights c
101101
}
102102
}
103103

104-
var totalPositions = (int)clipModel.CountPositions(chunks);
104+
var totalPositions = (int)chunks.CountPositions();
105105
return new MtmdChunkSequence(chunks, textTokens, totalPositions);
106106
}
107107

LLama/LLamaExecutorBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ protected Task PreprocessMtmd(string text, InferStateArgs args, bool addBos, boo
362362
tokens.Add(token);
363363
}
364364

365-
var totalPositions = (int)ClipModel.CountPositions(chunks);
365+
var totalPositions = (int)chunks.CountPositions();
366366
var fillerToken = GetFillerToken(marker);
367367

368368
if (replaceExisting)

LLama/MtmdWeights.cs

Lines changed: 73 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,79 @@
1-
21
using System;
32
using System.Threading;
43
using System.Threading.Tasks;
4+
using LLama.Exceptions;
55
using LLama.Native;
66

77
namespace LLama;
88

99
/// <summary>
1010
/// Lightweight wrapper around the MTMD native context and its helpers.
1111
/// </summary>
12-
public sealed class MtmdWeights : IDisposable
12+
public sealed class MtmdWeights
13+
: IDisposable
1314
{
15+
/// <summary>
16+
/// The native handle, which is used in the native APIs
17+
/// </summary>
18+
/// <remarks>Be careful how you use this!</remarks>
1419
public SafeMtmdModelHandle NativeHandle { get; }
1520

1621
private MtmdWeights(SafeMtmdModelHandle handle)
1722
{
1823
NativeHandle = handle ?? throw new ArgumentNullException(nameof(handle));
1924
}
2025

26+
/// <summary>
27+
/// Load weights into memory
28+
/// </summary>
29+
/// <param name="mmProject">Path to the mmproj file</param>
30+
/// <param name="textModel">The text model</param>
31+
/// <param name="mtmdCtxParams">Parameters for MTMD context creation</param>
32+
/// <returns></returns>
2133
public static MtmdWeights LoadFromFile(string mmProject, LLamaWeights textModel, MtmdContextParams mtmdCtxParams)
2234
{
23-
if (mmProject == null) throw new ArgumentNullException(nameof(mmProject));
24-
if (textModel == null) throw new ArgumentNullException(nameof(textModel));
25-
if (mtmdCtxParams == null) throw new ArgumentNullException(nameof(mtmdCtxParams));
26-
27-
var handle = SafeMtmdModelHandle.LoadFromFile(mmProject, textModel, mtmdCtxParams);
28-
return new MtmdWeights(handle);
35+
return new MtmdWeights(SafeMtmdModelHandle.LoadFromFile(
36+
mmProject ?? throw new ArgumentNullException(nameof(mmProject)),
37+
textModel ?? throw new ArgumentNullException(nameof(textModel)),
38+
mtmdCtxParams ?? throw new ArgumentNullException(nameof(mtmdCtxParams))
39+
));
2940
}
3041

31-
public static Task<MtmdWeights> LoadFromFileAsync(string mmProject, LLamaWeights textModel, MtmdContextParams mtmdCtxParams, CancellationToken token = default)
42+
/// <summary>
43+
/// Load weights into memory
44+
/// </summary>
45+
/// <param name="mmProject">Path to the mmproj file</param>
46+
/// <param name="textModel">The text model</param>
47+
/// <param name="mtmdCtxParams">Parameters for MTMD context creation</param>
48+
/// <param name="token"></param>
49+
/// <returns></returns>
50+
public static async Task<MtmdWeights> LoadFromFileAsync(string mmProject, LLamaWeights textModel, MtmdContextParams mtmdCtxParams, CancellationToken token = default)
3251
{
33-
return Task.Run(() => LoadFromFile(mmProject, textModel, mtmdCtxParams), token);
52+
if (mmProject == null)
53+
throw new ArgumentNullException(nameof(mmProject));
54+
if (textModel == null)
55+
throw new ArgumentNullException(nameof(textModel));
56+
if (mtmdCtxParams == null)
57+
throw new ArgumentNullException(nameof(mtmdCtxParams));
58+
59+
var model = await Task.Run(() =>
60+
{
61+
try
62+
{
63+
// Load the model
64+
return LoadFromFile(mmProject, textModel, mtmdCtxParams);
65+
}
66+
catch (LoadWeightsFailedException)
67+
{
68+
// Convert a LoadWeightsFailedException into a cancellation exception if possible.
69+
token.ThrowIfCancellationRequested();
70+
71+
// Ok the weights failed to load for some reason other than cancellation.
72+
throw;
73+
}
74+
}, token);
75+
76+
return model;
3477
}
3578

3679
/// <summary>
@@ -73,15 +116,31 @@ public int EvaluateChunk(IntPtr chunkPtr, SafeLLamaContextHandle llamaContext, r
73116
public int DecodeImageChunk(IntPtr chunkPtr, SafeLLamaContextHandle llamaContext, IntPtr encodedEmbeddings, ref int nPast, int seqId, int nBatch)
74117
=> NativeHandle.DecodeImageChunk(chunkPtr, llamaContext, encodedEmbeddings, ref nPast, seqId, nBatch);
75118

76-
public ulong CountTokens(SafeMtmdInputChunks chunks) => NativeHandle.CountTokens(chunks);
77-
78-
public long CountPositions(SafeMtmdInputChunks chunks) => NativeHandle.CountPositions(chunks);
79-
119+
/// <summary>
120+
/// Indicates whether the model supports vision inputs.
121+
/// </summary>
80122
public bool SupportsVision => NativeHandle.SupportVision();
123+
124+
/// <summary>
125+
/// Indicates whether the model supports audio inputs.
126+
/// </summary>
81127
public bool SupportsAudio => NativeHandle.SupportAudio();
128+
129+
/// <summary>
130+
/// Indicates whether the model decodes using the non-causal path.
131+
/// </summary>
82132
public bool UsesNonCausalAttention => NativeHandle.DecodeUseNonCausal();
133+
134+
/// <summary>
135+
/// Indicates whether the model decodes using multi-scale RoPE.
136+
/// </summary>
83137
public bool UsesMRope => NativeHandle.DecodeUseMRope();
138+
139+
/// <summary>
140+
/// Gets the audio bitrate advertised by the model.
141+
/// </summary>
84142
public int AudioBitrate => NativeHandle.GetAudioBitrate();
85143

144+
/// <inheritdoc />
86145
public void Dispose() => NativeHandle.Dispose();
87146
}

LLama/Native/NativeApi.Mtmd.cs

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using static LLama.Native.SafeMtmdInputChunk;
23

34
namespace LLama.Native;
45

@@ -42,64 +43,61 @@ internal struct mtmd_context_params
4243

4344
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_decode_use_non_causal", CallingConvention = CallingConvention.Cdecl)]
4445
[return: MarshalAs(UnmanagedType.I1)]
45-
internal static extern bool mtmd_decode_use_non_causal(IntPtr ctx);
46+
internal static extern bool mtmd_decode_use_non_causal(SafeMtmdModelHandle ctx);
4647

4748
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_decode_use_mrope", CallingConvention = CallingConvention.Cdecl)]
4849
[return: MarshalAs(UnmanagedType.I1)]
49-
internal static extern bool mtmd_decode_use_mrope(IntPtr ctx);
50+
internal static extern bool mtmd_decode_use_mrope(SafeMtmdModelHandle ctx);
5051

5152
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_support_vision", CallingConvention = CallingConvention.Cdecl)]
5253
[return: MarshalAs(UnmanagedType.I1)]
53-
internal static extern bool mtmd_support_vision(IntPtr ctx);
54+
internal static extern bool mtmd_support_vision(SafeMtmdModelHandle ctx);
5455

5556
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_support_audio", CallingConvention = CallingConvention.Cdecl)]
5657
[return: MarshalAs(UnmanagedType.I1)]
57-
internal static extern bool mtmd_support_audio(IntPtr ctx);
58+
internal static extern bool mtmd_support_audio(SafeMtmdModelHandle ctx);
5859

5960
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_get_audio_bitrate", CallingConvention = CallingConvention.Cdecl)]
60-
internal static extern int mtmd_get_audio_bitrate(IntPtr ctx);
61+
internal static extern int mtmd_get_audio_bitrate(SafeMtmdModelHandle ctx);
6162

6263
// bitmap ------------------------------------------------------------
6364

6465
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_init", CallingConvention = CallingConvention.Cdecl)]
65-
internal static extern IntPtr mtmd_bitmap_init(uint nx, uint ny, IntPtr data);
66+
internal static extern unsafe IntPtr mtmd_bitmap_init(uint nx, uint ny, byte* data);
6667

6768
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_init_from_audio", CallingConvention = CallingConvention.Cdecl)]
68-
internal static extern IntPtr mtmd_bitmap_init_from_audio(ulong n_samples, IntPtr data);
69+
internal static extern unsafe IntPtr mtmd_bitmap_init_from_audio(ulong n_samples, float* data);
6970

7071
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_get_nx", CallingConvention = CallingConvention.Cdecl)]
71-
internal static extern uint mtmd_bitmap_get_nx(IntPtr bitmap);
72+
internal static extern uint mtmd_bitmap_get_nx(SafeMtmdEmbed bitmap);
7273

7374
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_get_ny", CallingConvention = CallingConvention.Cdecl)]
74-
internal static extern uint mtmd_bitmap_get_ny(IntPtr bitmap);
75+
internal static extern uint mtmd_bitmap_get_ny(SafeMtmdEmbed bitmap);
7576

7677
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_get_data", CallingConvention = CallingConvention.Cdecl)]
77-
internal static extern IntPtr mtmd_bitmap_get_data(IntPtr bitmap);
78+
internal static extern IntPtr mtmd_bitmap_get_data(SafeMtmdEmbed bitmap);
7879

7980
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_get_n_bytes", CallingConvention = CallingConvention.Cdecl)]
80-
internal static extern UIntPtr mtmd_bitmap_get_n_bytes(IntPtr bitmap);
81+
internal static extern UIntPtr mtmd_bitmap_get_n_bytes(SafeMtmdEmbed bitmap);
8182

8283
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_is_audio", CallingConvention = CallingConvention.Cdecl)]
8384
[return: MarshalAs(UnmanagedType.I1)]
84-
internal static extern bool mtmd_bitmap_is_audio(IntPtr bitmap);
85+
internal static extern bool mtmd_bitmap_is_audio(SafeMtmdEmbed bitmap);
8586

8687
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_free", CallingConvention = CallingConvention.Cdecl)]
8788
internal static extern void mtmd_bitmap_free(IntPtr bitmap);
8889

8990
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_get_id", CallingConvention = CallingConvention.Cdecl)]
90-
internal static extern IntPtr mtmd_bitmap_get_id(IntPtr bitmap);
91+
internal static extern IntPtr mtmd_bitmap_get_id(SafeMtmdEmbed bitmap);
9192

9293
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_bitmap_set_id", CallingConvention = CallingConvention.Cdecl)]
93-
private static extern unsafe void mtmd_bitmap_set_id_native(IntPtr bitmap, byte* id);
94+
private static extern unsafe void mtmd_bitmap_set_id_native(SafeMtmdEmbed bitmap, byte* id);
9495

9596
/// <summary>
9697
/// Assign an identifier to a bitmap using a UTF-8 encoded string.
9798
/// </summary>
98-
internal static unsafe void mtmd_bitmap_set_id(IntPtr bitmap, string? id)
99+
internal static unsafe void mtmd_bitmap_set_id(SafeMtmdEmbed bitmap, string? id)
99100
{
100-
if (bitmap == IntPtr.Zero)
101-
throw new ArgumentNullException(nameof(bitmap));
102-
103101
if (id is null)
104102
{
105103
mtmd_bitmap_set_id_native(bitmap, null);
@@ -127,25 +125,25 @@ internal static unsafe void mtmd_bitmap_set_id(IntPtr bitmap, string? id)
127125
// input_chunk -------------------------------------------------------
128126

129127
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_get_type", CallingConvention = CallingConvention.Cdecl)]
130-
internal static extern int mtmd_input_chunk_get_type(IntPtr chunk);
128+
internal static extern SafeMtmdInputChunkType mtmd_input_chunk_get_type(SafeMtmdInputChunk chunk);
131129

132130
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_get_tokens_text", CallingConvention = CallingConvention.Cdecl)]
133-
internal static extern IntPtr mtmd_input_chunk_get_tokens_text(IntPtr chunk, out UIntPtr n_tokens);
131+
internal static extern IntPtr mtmd_input_chunk_get_tokens_text(SafeMtmdInputChunk chunk, out UIntPtr n_tokens);
134132

135133
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_get_tokens_image", CallingConvention = CallingConvention.Cdecl)]
136134
internal static extern IntPtr mtmd_input_chunk_get_tokens_image(IntPtr chunk);
137135

138136
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_get_n_tokens", CallingConvention = CallingConvention.Cdecl)]
139-
internal static extern UIntPtr mtmd_input_chunk_get_n_tokens(IntPtr chunk);
137+
internal static extern UIntPtr mtmd_input_chunk_get_n_tokens(SafeMtmdInputChunk chunk);
140138

141139
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_get_id", CallingConvention = CallingConvention.Cdecl)]
142-
internal static extern IntPtr mtmd_input_chunk_get_id(IntPtr chunk);
140+
internal static extern IntPtr mtmd_input_chunk_get_id(SafeMtmdInputChunk chunk);
143141

144142
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_get_n_pos", CallingConvention = CallingConvention.Cdecl)]
145-
internal static extern int mtmd_input_chunk_get_n_pos(IntPtr chunk);
143+
internal static extern int mtmd_input_chunk_get_n_pos(SafeMtmdInputChunk chunk);
146144

147145
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_copy", CallingConvention = CallingConvention.Cdecl)]
148-
internal static extern IntPtr mtmd_input_chunk_copy(IntPtr chunk);
146+
internal static extern IntPtr mtmd_input_chunk_copy(SafeMtmdInputChunk chunk);
149147

150148
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_input_chunk_free", CallingConvention = CallingConvention.Cdecl)]
151149
internal static extern void mtmd_input_chunk_free(IntPtr chunk);
@@ -203,19 +201,27 @@ public MtmdInputTextScope(string text, bool addSpecial, bool parseSpecial)
203201

204202
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_tokenize", CallingConvention = CallingConvention.Cdecl)]
205203
private static extern unsafe int mtmd_tokenize_native(
206-
IntPtr ctx,
204+
SafeMtmdModelHandle ctx,
207205
IntPtr output,
208206
mtmd_input_text_native* text,
209207
IntPtr[] bitmaps,
210208
UIntPtr n_bitmaps);
211209

212-
internal static unsafe int mtmd_tokenize(IntPtr ctx, IntPtr output, in mtmd_input_text_native text, IntPtr[] bitmaps, UIntPtr n_bitmaps)
210+
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_tokenize", CallingConvention = CallingConvention.Cdecl)]
211+
private static extern unsafe int mtmd_tokenize_native(
212+
SafeMtmdModelHandle ctx,
213+
IntPtr output,
214+
mtmd_input_text_native* text,
215+
SafeMtmdEmbed[] bitmaps,
216+
UIntPtr n_bitmaps);
217+
218+
internal static unsafe int mtmd_tokenize(SafeMtmdModelHandle ctx, IntPtr output, in mtmd_input_text_native text, IntPtr[] bitmaps, nuint n_bitmaps)
213219
{
214220
var temp = text;
215221
return mtmd_tokenize_native(ctx, output, &temp, bitmaps, n_bitmaps);
216222
}
217223

218-
internal static unsafe int mtmd_tokenize(IntPtr ctx, IntPtr output, string text, bool addSpecial, bool parseSpecial, IntPtr[] bitmaps, UIntPtr n_bitmaps)
224+
internal static unsafe int mtmd_tokenize(SafeMtmdModelHandle ctx, IntPtr output, string text, bool addSpecial, bool parseSpecial, IntPtr[] bitmaps, nuint n_bitmaps)
219225
{
220226
using var scope = new MtmdInputTextScope(text, addSpecial, parseSpecial);
221227
return mtmd_tokenize_native(ctx, output, &scope.Value, bitmaps, n_bitmaps);
@@ -236,28 +242,28 @@ internal static unsafe int mtmd_tokenize(IntPtr ctx, IntPtr output, string text,
236242
internal static extern IntPtr mtmd_test_create_input_chunks();
237243

238244
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_bitmap_init_from_file", CallingConvention = CallingConvention.Cdecl)]
239-
private static extern unsafe IntPtr mtmd_helper_bitmap_init_from_file_native(IntPtr ctx, byte* fname);
245+
private static extern unsafe IntPtr mtmd_helper_bitmap_init_from_file_native(SafeMtmdModelHandle ctx, byte* fname);
240246

241-
internal static unsafe IntPtr mtmd_helper_bitmap_init_from_file(IntPtr ctx, string fname)
247+
internal static unsafe IntPtr mtmd_helper_bitmap_init_from_file(SafeMtmdModelHandle ctx, string fname)
242248
{
243249
using var pinned = PinnedUtf8String.Create(fname) ?? throw new ArgumentNullException(nameof(fname));
244250
return mtmd_helper_bitmap_init_from_file_native(ctx, (byte*)pinned.Pointer);
245251
}
246252

247253
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_bitmap_init_from_buf", CallingConvention = CallingConvention.Cdecl)]
248-
internal static extern IntPtr mtmd_helper_bitmap_init_from_buf(IntPtr ctx, IntPtr buf, UIntPtr len);
254+
internal static extern unsafe IntPtr mtmd_helper_bitmap_init_from_buf(SafeMtmdModelHandle ctx, byte* buf, nuint len);
249255

250256
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_get_n_tokens", CallingConvention = CallingConvention.Cdecl)]
251-
internal static extern UIntPtr mtmd_helper_get_n_tokens(IntPtr chunks);
257+
internal static extern UIntPtr mtmd_helper_get_n_tokens(SafeMtmdInputChunks chunks);
252258

253259
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_get_n_pos", CallingConvention = CallingConvention.Cdecl)]
254-
internal static extern int mtmd_helper_get_n_pos(IntPtr chunks);
260+
internal static extern int mtmd_helper_get_n_pos(SafeMtmdInputChunks chunks);
255261

256262
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_eval_chunks", CallingConvention = CallingConvention.Cdecl)]
257263
internal static extern int mtmd_helper_eval_chunks(
258-
IntPtr ctx,
259-
IntPtr lctx,
260-
IntPtr chunks,
264+
SafeMtmdModelHandle ctx,
265+
SafeLLamaContextHandle lctx,
266+
SafeMtmdInputChunks chunks,
261267
int n_past,
262268
int seq_id,
263269
int n_batch,
@@ -266,8 +272,8 @@ internal static extern int mtmd_helper_eval_chunks(
266272

267273
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_eval_chunk_single", CallingConvention = CallingConvention.Cdecl)]
268274
internal static extern int mtmd_helper_eval_chunk_single(
269-
IntPtr ctx,
270-
IntPtr lctx,
275+
SafeMtmdModelHandle ctx,
276+
SafeLLamaContextHandle lctx,
271277
IntPtr chunk,
272278
int n_past,
273279
int seq_id,
@@ -277,8 +283,8 @@ internal static extern int mtmd_helper_eval_chunk_single(
277283

278284
[DllImport(mtmdLibraryName, EntryPoint = "mtmd_helper_decode_image_chunk", CallingConvention = CallingConvention.Cdecl)]
279285
internal static extern int mtmd_helper_decode_image_chunk(
280-
IntPtr ctx,
281-
IntPtr lctx,
286+
SafeMtmdModelHandle ctx,
287+
SafeLLamaContextHandle lctx,
282288
IntPtr chunk,
283289
IntPtr encoded_embd,
284290
int n_past,

0 commit comments

Comments
 (0)