Buckets:
| from __future__ import annotations | |
| import os | |
| import warnings | |
| from ctypes import ( | |
| c_bool, | |
| c_char_p, | |
| c_int, | |
| c_uint8, | |
| c_uint32, | |
| c_size_t, | |
| c_float, | |
| c_void_p, | |
| POINTER, | |
| _Pointer, # type: ignore | |
| Structure, | |
| byref, | |
| ) | |
| import pathlib | |
| from typing import ( | |
| Union, | |
| NewType, | |
| Optional, | |
| TYPE_CHECKING, | |
| ) | |
| import llama_cpp.llama_cpp as llama_cpp | |
| from llama_cpp._ctypes_extensions import ( | |
| load_shared_library, | |
| ctypes_function_for_shared_library, | |
| ) | |
| if TYPE_CHECKING: | |
| from llama_cpp._ctypes_extensions import ( | |
| CtypesArray, | |
| ) | |
| # Specify the base name of the shared library to load | |
| _libmtmd_base_name = "mtmd" | |
| _libmtmd_override_path = os.environ.get("MTMD_CPP_LIB") | |
| _libmtmd_base_path = ( | |
| pathlib.Path(os.path.abspath(os.path.dirname(__file__))) / "lib" | |
| if _libmtmd_override_path is None | |
| else pathlib.Path(_libmtmd_override_path) | |
| ) | |
| # Load the library | |
| _libmtmd = load_shared_library(_libmtmd_base_name, _libmtmd_base_path) | |
| ctypes_function = ctypes_function_for_shared_library(_libmtmd) | |
| ################################################ | |
| # mtmd.h types | |
| ################################################ | |
| # Opaque types | |
| mtmd_context_p = NewType("mtmd_context_p", int) | |
| mtmd_context_p_ctypes = c_void_p | |
| mtmd_bitmap_p = NewType("mtmd_bitmap_p", int) | |
| mtmd_bitmap_p_ctypes = c_void_p | |
| mtmd_image_tokens_p = NewType("mtmd_image_tokens_p", int) | |
| mtmd_image_tokens_p_ctypes = c_void_p | |
| mtmd_input_chunk_p = NewType("mtmd_input_chunk_p", int) | |
| mtmd_input_chunk_p_ctypes = c_void_p | |
| mtmd_input_chunks_p = NewType("mtmd_input_chunks_p", int) | |
| mtmd_input_chunks_p_ctypes = c_void_p | |
| # Enums | |
| MTMD_INPUT_CHUNK_TYPE_TEXT = 0 | |
| MTMD_INPUT_CHUNK_TYPE_IMAGE = 1 | |
| MTMD_INPUT_CHUNK_TYPE_AUDIO = 2 | |
| # Structures | |
| class mtmd_context_params(Structure): | |
| """Context parameters for MTMD initialization. | |
| `image_marker` is deprecated upstream and kept for compatibility; use | |
| `media_marker` for multimodal prompt placeholders. | |
| """ | |
| if TYPE_CHECKING: | |
| use_gpu: bool | |
| print_timings: bool | |
| n_threads: int | |
| image_marker: Optional[bytes] | |
| media_marker: Optional[bytes] | |
| flash_attn_type: int | |
| warmup: bool | |
| image_min_tokens: int | |
| image_max_tokens: int | |
| cb_eval: llama_cpp.ggml_backend_sched_eval_callback | |
| cb_eval_user_data: c_void_p | |
| _fields_ = [ | |
| ("use_gpu", c_bool), | |
| ("print_timings", c_bool), | |
| ("n_threads", c_int), | |
| ("image_marker", c_char_p), | |
| ("media_marker", c_char_p), | |
| ("flash_attn_type", c_int), | |
| ("warmup", c_bool), | |
| ("image_min_tokens", c_int), | |
| ("image_max_tokens", c_int), | |
| ("cb_eval", llama_cpp.ggml_backend_sched_eval_callback), | |
| ("cb_eval_user_data", c_void_p), | |
| ] | |
| class mtmd_input_text(Structure): | |
| """Text input passed to `mtmd_tokenize`.""" | |
| _fields_ = [ | |
| ("text", c_char_p), | |
| ("add_special", c_bool), | |
| ("parse_special", c_bool), | |
| ] | |
| class mtmd_decoder_pos(Structure): | |
| """Decoder attention position for M-RoPE models.""" | |
| _fields_ = [ | |
| ("t", c_uint32), | |
| ("x", c_uint32), | |
| ("y", c_uint32), | |
| ("z", c_uint32), | |
| ] | |
| # struct mtmd_caps { | |
| # bool inp_vision; | |
| # bool inp_audio; | |
| # }; | |
| class mtmd_caps(Structure): | |
| """Capabilities exposed by an mmproj file.""" | |
| if TYPE_CHECKING: | |
| inp_vision: bool | |
| inp_audio: bool | |
| _fields_ = [ | |
| ("inp_vision", c_bool), | |
| ("inp_audio", c_bool), | |
| ] | |
| ################################################ | |
| # mtmd.h functions | |
| ################################################ | |
| # MTMD_API const char * mtmd_default_marker(void); | |
| def mtmd_default_marker() -> bytes: | |
| """Return the default media marker.""" | |
| ... | |
| # MTMD_API struct mtmd_context_params mtmd_context_params_default(void); | |
| def mtmd_context_params_default() -> mtmd_context_params: | |
| """Return the default MTMD context parameters.""" | |
| ... | |
| # MTMD_API mtmd_context * mtmd_init_from_file(const char * mmproj_fname, | |
| # const struct llama_model * text_model, | |
| # const struct mtmd_context_params ctx_params); | |
| def mtmd_init_from_file( | |
| mmproj_fname: bytes, | |
| text_model: llama_cpp.llama_model_p, | |
| ctx_params: mtmd_context_params, | |
| /, | |
| ) -> Optional[mtmd_context_p]: | |
| """Initialize the MTMD context from a projector file. Returns None on failure.""" | |
| ... | |
| # MTMD_API void mtmd_free(mtmd_context * ctx); | |
| def mtmd_free(ctx: mtmd_context_p, /): ... | |
| # MTMD_API bool mtmd_decode_use_non_causal(const mtmd_context * ctx, const mtmd_input_chunk * chunk); | |
| def mtmd_decode_use_non_causal( | |
| ctx: mtmd_context_p, chunk: Optional[mtmd_input_chunk_p], / | |
| ) -> bool: | |
| """Check whether MTMD decoding uses non-causal attention.""" | |
| ... | |
| # MTMD_API bool mtmd_decode_use_mrope(const mtmd_context * ctx); | |
| def mtmd_decode_use_mrope(ctx: mtmd_context_p, /) -> bool: | |
| """Check whether MTMD decoding uses mRoPE.""" | |
| ... | |
| # MTMD_API bool mtmd_support_vision(const mtmd_context * ctx); | |
| def mtmd_support_vision(ctx: mtmd_context_p, /) -> bool: | |
| """Check whether the current model supports vision input.""" | |
| ... | |
| # MTMD_API bool mtmd_support_audio(const mtmd_context * ctx); | |
| def mtmd_support_audio(ctx: mtmd_context_p, /) -> bool: | |
| """Check whether MTMD supports audio.""" | |
| ... | |
| # MTMD_API int mtmd_get_audio_sample_rate(const mtmd_context * ctx); | |
| def mtmd_get_audio_sample_rate(ctx: mtmd_context_p, /) -> int: | |
| """Get the audio sample rate in Hz. Returns -1 if audio is not supported.""" | |
| ... | |
| # Deprecated compatibility wrapper for the renamed mtmd_get_audio_sample_rate(). | |
| def mtmd_get_audio_bitrate(ctx: mtmd_context_p, /) -> int: | |
| warnings.warn( | |
| "mtmd_get_audio_bitrate is deprecated; use mtmd_get_audio_sample_rate instead", | |
| DeprecationWarning, | |
| stacklevel=2, | |
| ) | |
| return mtmd_get_audio_sample_rate(ctx) | |
| # MTMD_API mtmd_bitmap * mtmd_bitmap_init(uint32_t nx, uint32_t ny, const unsigned char * data); | |
| def mtmd_bitmap_init( | |
| nx: Union[c_uint32, int], | |
| ny: Union[c_uint32, int], | |
| data: CtypesArray[c_uint8], | |
| /, | |
| ) -> Optional[mtmd_bitmap_p]: ... | |
| # MTMD_API mtmd_bitmap * mtmd_bitmap_init_from_audio(size_t n_samples, const float * data); | |
| def mtmd_bitmap_init_from_audio( | |
| n_samples: Union[c_size_t, int], | |
| data: CtypesArray[c_float], | |
| /, | |
| ) -> Optional[mtmd_bitmap_p]: | |
| """Initialize an MTMD bitmap from audio samples.""" | |
| ... | |
| # MTMD_API void mtmd_bitmap_free(mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_free(bitmap: mtmd_bitmap_p, /): ... | |
| # MTMD_API uint32_t mtmd_bitmap_get_nx(const mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_get_nx(bitmap: mtmd_bitmap_p, /) -> int: | |
| """Get the bitmap width in pixels.""" | |
| ... | |
| # MTMD_API uint32_t mtmd_bitmap_get_ny(const mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_get_ny(bitmap: mtmd_bitmap_p, /) -> int: | |
| """Get the bitmap height in pixels.""" | |
| ... | |
| # MTMD_API const unsigned char * mtmd_bitmap_get_data(const mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_get_data(bitmap: mtmd_bitmap_p, /) -> Optional[CtypesArray[c_uint8]]: | |
| """Get the raw bitmap data buffer.""" | |
| ... | |
| # MTMD_API size_t mtmd_bitmap_get_n_bytes(const mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_get_n_bytes(bitmap: mtmd_bitmap_p, /) -> int: | |
| """Get the bitmap data size in bytes.""" | |
| ... | |
| # MTMD_API bool mtmd_bitmap_is_audio(const mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_is_audio(bitmap: mtmd_bitmap_p, /) -> bool: | |
| """Check whether the bitmap contains audio data.""" | |
| ... | |
| # MTMD_API const char * mtmd_bitmap_get_id(const mtmd_bitmap * bitmap); | |
| def mtmd_bitmap_get_id(bitmap: mtmd_bitmap_p, /) -> Optional[bytes]: | |
| """Get the optional bitmap identifier.""" | |
| ... | |
| # MTMD_API void mtmd_bitmap_set_id(mtmd_bitmap * bitmap, const char * id); | |
| def mtmd_bitmap_set_id(bitmap: mtmd_bitmap_p, id: Optional[bytes], /): | |
| """Set the optional bitmap identifier.""" | |
| ... | |
| # MTMD_API mtmd_input_chunks * mtmd_input_chunks_init(void); | |
| def mtmd_input_chunks_init() -> Optional[mtmd_input_chunks_p]: ... | |
| # MTMD_API void mtmd_input_chunks_free(mtmd_input_chunks * chunks); | |
| def mtmd_input_chunks_free(chunks: mtmd_input_chunks_p, /): ... | |
| # MTMD_API size_t mtmd_input_chunks_size(const mtmd_input_chunks * chunks); | |
| def mtmd_input_chunks_size(chunks: mtmd_input_chunks_p, /) -> int: ... | |
| # MTMD_API const mtmd_input_chunk * mtmd_input_chunks_get(const mtmd_input_chunks * chunks, size_t idx); | |
| def mtmd_input_chunks_get( | |
| chunks: mtmd_input_chunks_p, idx: Union[c_size_t, int], / | |
| ) -> Optional[mtmd_input_chunk_p]: ... | |
| # MTMD_API int32_t mtmd_tokenize(mtmd_context * ctx, | |
| # mtmd_input_chunks * output, | |
| # const mtmd_input_text * text, | |
| # const mtmd_bitmap ** bitmaps, | |
| # size_t n_bitmaps); | |
| def mtmd_tokenize( | |
| ctx: mtmd_context_p, | |
| output: mtmd_input_chunks_p, | |
| text: "_Pointer[mtmd_input_text]", | |
| bitmaps: CtypesArray[mtmd_bitmap_p_ctypes], | |
| n_bitmaps: Union[c_size_t, int], | |
| /, | |
| ) -> int: ... | |
| # MTMD_API size_t mtmd_input_chunk_get_n_tokens(const mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_get_n_tokens(chunk: mtmd_input_chunk_p, /) -> int: ... | |
| # MTMD_API enum mtmd_input_chunk_type mtmd_input_chunk_get_type(const mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_get_type(chunk: mtmd_input_chunk_p, /) -> int: ... | |
| # MTMD_API const llama_token * mtmd_input_chunk_get_tokens_text(const mtmd_input_chunk * chunk, size_t * n_tokens_output); | |
| def mtmd_input_chunk_get_tokens_text( | |
| chunk: mtmd_input_chunk_p, n_tokens_output: "_Pointer[c_size_t]", / | |
| ) -> Optional["_Pointer[llama_cpp.llama_token]"]: ... | |
| # MTMD_API const mtmd_image_tokens * mtmd_input_chunk_get_tokens_image(const mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_get_tokens_image( | |
| chunk: mtmd_input_chunk_p, / | |
| ) -> Optional[mtmd_image_tokens_p]: ... | |
| # MTMD_API const char * mtmd_input_chunk_get_id(const mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_get_id(chunk: mtmd_input_chunk_p, /) -> Optional[bytes]: | |
| """Get the optional chunk identifier.""" | |
| ... | |
| # MTMD_API llama_pos mtmd_input_chunk_get_n_pos(const mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_get_n_pos(chunk: mtmd_input_chunk_p, /) -> int: | |
| """Get the number of positions consumed by the chunk.""" | |
| ... | |
| # MTMD_API mtmd_input_chunk * mtmd_input_chunk_copy(const mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_copy(chunk: mtmd_input_chunk_p, /) -> Optional[mtmd_input_chunk_p]: | |
| """Copy an input chunk and transfer ownership to the caller.""" | |
| ... | |
| # MTMD_API void mtmd_input_chunk_free(mtmd_input_chunk * chunk); | |
| def mtmd_input_chunk_free(chunk: mtmd_input_chunk_p, /): | |
| """Free an owned input chunk.""" | |
| ... | |
| # MTMD_API size_t mtmd_image_tokens_get_n_tokens(const mtmd_image_tokens * image_tokens); | |
| def mtmd_image_tokens_get_n_tokens(image_tokens: mtmd_image_tokens_p, /) -> int: | |
| """Get the number of image tokens.""" | |
| ... | |
| # DEPRECATED(MTMD_API size_t mtmd_image_tokens_get_nx(const mtmd_image_tokens * image_tokens), | |
| # "use mtmd_image_tokens_get_decoder_pos() instead"); | |
| def mtmd_image_tokens_get_nx(image_tokens: mtmd_image_tokens_p, /) -> int: | |
| """Get the image token grid width.""" | |
| ... | |
| # DEPRECATED(MTMD_API size_t mtmd_image_tokens_get_ny(const mtmd_image_tokens * image_tokens), | |
| # "use mtmd_image_tokens_get_decoder_pos() instead"); | |
| def mtmd_image_tokens_get_ny(image_tokens: mtmd_image_tokens_p, /) -> int: | |
| """Get the image token grid height.""" | |
| ... | |
| # MTMD_API const char * mtmd_image_tokens_get_id(const mtmd_image_tokens * image_tokens); | |
| def mtmd_image_tokens_get_id(image_tokens: mtmd_image_tokens_p, /) -> Optional[bytes]: | |
| """Get the optional image token identifier.""" | |
| ... | |
| # MTMD_API llama_pos mtmd_image_tokens_get_n_pos(const mtmd_image_tokens * image_tokens); | |
| def mtmd_image_tokens_get_n_pos(image_tokens: mtmd_image_tokens_p, /) -> int: | |
| """Get the number of positions consumed by the image tokens.""" | |
| ... | |
| # MTMD_API struct mtmd_decoder_pos mtmd_image_tokens_get_decoder_pos( | |
| # const mtmd_image_tokens * image_tokens, llama_pos pos_0, size_t i); | |
| def mtmd_image_tokens_get_decoder_pos( | |
| image_tokens: mtmd_image_tokens_p, | |
| pos_0: llama_cpp.llama_pos, | |
| i: Union[c_size_t, int], | |
| /, | |
| ) -> mtmd_decoder_pos: | |
| """Get decoder attention position for an image embedding token.""" | |
| ... | |
| # MTMD_API int32_t mtmd_encode(mtmd_context * ctx, const mtmd_image_tokens * image_tokens); | |
| def mtmd_encode(ctx: mtmd_context_p, image_tokens: mtmd_image_tokens_p, /) -> int: | |
| """Run an MTMD encode pass for image tokens.""" | |
| ... | |
| # MTMD_API int32_t mtmd_encode_chunk(mtmd_context * ctx, const mtmd_input_chunk * chunk); | |
| def mtmd_encode_chunk(ctx: mtmd_context_p, chunk: mtmd_input_chunk_p, /) -> int: | |
| """Run an MTMD encode pass for a single chunk.""" | |
| ... | |
| # MTMD_API float * mtmd_get_output_embd(mtmd_context * ctx); | |
| def mtmd_get_output_embd(ctx: mtmd_context_p, /) -> Optional[CtypesArray[c_float]]: | |
| """Get output embeddings from the last encode pass.""" | |
| ... | |
| # MTMD_API struct mtmd_caps mtmd_get_cap_from_file(const char * mmproj_fname); | |
| def mtmd_get_cap_from_file(mmproj_fname: bytes, /) -> mtmd_caps: | |
| """Get mmproj capabilities without initializing a full MTMD context.""" | |
| ... | |
| # MTMD_API mtmd_input_chunks * mtmd_test_create_input_chunks(void); | |
| def mtmd_test_create_input_chunks() -> Optional[mtmd_input_chunks_p]: | |
| """Create MTMD test chunks for the C API tests.""" | |
| ... | |
| ################################################ | |
| # mtmd-helper.h functions | |
| ################################################ | |
| # MTMD_API mtmd_bitmap * mtmd_helper_bitmap_init_from_file(mtmd_context * ctx, const char * fname, bool placeholder); | |
| def mtmd_helper_bitmap_init_from_file( | |
| ctx: mtmd_context_p, fname: bytes, placeholder: Union[c_bool, bool], / | |
| ) -> Optional[mtmd_bitmap_p]: | |
| """Initialize an MTMD bitmap from a file.""" | |
| ... | |
| # MTMD_API mtmd_bitmap * mtmd_helper_bitmap_init_from_buf(mtmd_context * ctx, const unsigned char * buf, size_t len, bool placeholder); | |
| def mtmd_helper_bitmap_init_from_buf( | |
| ctx: mtmd_context_p, | |
| buf: CtypesArray[c_uint8], | |
| length: Union[c_size_t, int], | |
| placeholder: Union[c_bool, bool], | |
| /, | |
| ) -> Optional[mtmd_bitmap_p]: ... | |
| # MTMD_API size_t mtmd_helper_get_n_tokens(const mtmd_input_chunks * chunks); | |
| def mtmd_helper_get_n_tokens(chunks: mtmd_input_chunks_p, /) -> int: ... | |
| # MTMD_API llama_pos mtmd_helper_get_n_pos(const mtmd_input_chunks * chunks); | |
| def mtmd_helper_get_n_pos(chunks: mtmd_input_chunks_p, /) -> int: | |
| """Count the total positions consumed by the chunks.""" | |
| ... | |
| # MTMD_API void mtmd_helper_image_get_decoder_pos( | |
| # const mtmd_image_tokens * image, llama_pos pos_0, struct mtmd_decoder_pos * out_pos); | |
| def mtmd_helper_image_get_decoder_pos( | |
| image: mtmd_image_tokens_p, | |
| pos_0: llama_cpp.llama_pos, | |
| out_pos: "_Pointer[mtmd_decoder_pos]", | |
| /, | |
| ): | |
| """Fill decoder attention positions for all image embedding tokens.""" | |
| ... | |
| # MTMD_API int32_t mtmd_helper_eval_chunks(mtmd_context * ctx, | |
| # struct llama_context * lctx, | |
| # const mtmd_input_chunks * chunks, | |
| # llama_pos n_past, | |
| # llama_seq_id seq_id, | |
| # int32_t n_batch, | |
| # bool logits_last, | |
| # llama_pos * new_n_past); | |
| def mtmd_helper_eval_chunks( | |
| ctx: mtmd_context_p, | |
| lctx: llama_cpp.llama_context_p, | |
| chunks: mtmd_input_chunks_p, | |
| n_past: llama_cpp.llama_pos, | |
| seq_id: llama_cpp.llama_seq_id, | |
| n_batch: Union[c_int, int], | |
| logits_last: Union[c_bool, bool], | |
| new_n_past: "_Pointer[llama_cpp.llama_pos]", | |
| /, | |
| ) -> int: ... | |
| # MTMD_API int32_t mtmd_helper_eval_chunk_single(mtmd_context * ctx, | |
| # struct llama_context * lctx, | |
| # const mtmd_input_chunk * chunk, | |
| # llama_pos n_past, | |
| # llama_seq_id seq_id, | |
| # int32_t n_batch, | |
| # bool logits_last, | |
| # llama_pos * new_n_past); | |
| def mtmd_helper_eval_chunk_single( | |
| ctx: mtmd_context_p, | |
| lctx: llama_cpp.llama_context_p, | |
| chunk: mtmd_input_chunk_p, | |
| n_past: llama_cpp.llama_pos, | |
| seq_id: llama_cpp.llama_seq_id, | |
| n_batch: Union[c_int, int], | |
| logits_last: Union[c_bool, bool], | |
| new_n_past: "_Pointer[llama_cpp.llama_pos]", | |
| /, | |
| ) -> int: ... | |
| # MTMD_API int32_t mtmd_helper_decode_image_chunk(mtmd_context * ctx, | |
| # struct llama_context * lctx, | |
| # const mtmd_input_chunk * chunk, | |
| # float * encoded_embd, | |
| # llama_pos n_past, | |
| # llama_seq_id seq_id, | |
| # int32_t n_batch, | |
| # llama_pos * new_n_past); | |
| def mtmd_helper_decode_image_chunk( | |
| ctx: mtmd_context_p, | |
| lctx: llama_cpp.llama_context_p, | |
| chunk: mtmd_input_chunk_p, | |
| encoded_embd: CtypesArray[c_float], | |
| n_past: llama_cpp.llama_pos, | |
| seq_id: llama_cpp.llama_seq_id, | |
| n_batch: Union[c_int, int], | |
| new_n_past: "_Pointer[llama_cpp.llama_pos]", | |
| /, | |
| ) -> int: | |
| """Decode a pre-encoded image chunk.""" | |
| ... | |
| # MTMD_API void mtmd_log_set(ggml_log_callback log_callback, void * user_data); | |
| def mtmd_log_set(log_callback, user_data: c_void_p, /): | |
| """Set the MTMD logging callback.""" | |
| ... | |
| # MTMD_API void mtmd_helper_log_set(ggml_log_callback log_callback, void * user_data); | |
| def mtmd_helper_log_set(log_callback, user_data: c_void_p, /): | |
| """Set the MTMD helper logging callback.""" | |
| ... | |
Xet Storage Details
- Size:
- 24.2 kB
- Xet hash:
- 5f60173a607093d2d94715e00c77caa09ec3d8f298367c6bfe37032a856b6967
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.