llama-cpp-capacitor 0.0.13 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/LlamaCpp.podspec +17 -17
  2. package/Package.swift +27 -27
  3. package/README.md +717 -574
  4. package/android/build.gradle +88 -69
  5. package/android/src/main/AndroidManifest.xml +2 -2
  6. package/android/src/main/CMakeLists-arm64.txt +131 -0
  7. package/android/src/main/CMakeLists-x86_64.txt +135 -0
  8. package/android/src/main/CMakeLists.txt +35 -52
  9. package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCpp.java +956 -717
  10. package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCppPlugin.java +710 -590
  11. package/android/src/main/jni-utils.h +7 -7
  12. package/android/src/main/jni.cpp +868 -127
  13. package/cpp/{rn-completion.cpp → cap-completion.cpp} +202 -24
  14. package/cpp/{rn-completion.h → cap-completion.h} +22 -11
  15. package/cpp/{rn-llama.cpp → cap-llama.cpp} +81 -27
  16. package/cpp/{rn-llama.h → cap-llama.h} +32 -20
  17. package/cpp/{rn-mtmd.hpp → cap-mtmd.hpp} +15 -15
  18. package/cpp/{rn-tts.cpp → cap-tts.cpp} +12 -12
  19. package/cpp/{rn-tts.h → cap-tts.h} +14 -14
  20. package/cpp/ggml-cpu/ggml-cpu-impl.h +30 -0
  21. package/dist/docs.json +100 -3
  22. package/dist/esm/definitions.d.ts +45 -2
  23. package/dist/esm/definitions.js.map +1 -1
  24. package/dist/esm/index.d.ts +22 -0
  25. package/dist/esm/index.js +66 -3
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/plugin.cjs.js +71 -3
  28. package/dist/plugin.cjs.js.map +1 -1
  29. package/dist/plugin.js +71 -3
  30. package/dist/plugin.js.map +1 -1
  31. package/ios/Sources/LlamaCppPlugin/LlamaCpp.swift +596 -596
  32. package/ios/Sources/LlamaCppPlugin/LlamaCppPlugin.swift +591 -514
  33. package/ios/Tests/LlamaCppPluginTests/LlamaCppPluginTests.swift +15 -15
  34. package/package.json +111 -110
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["// Native parameter types that match llama.rn exactly\r\nexport interface NativeEmbeddingParams {\r\n embd_normalize?: number;\r\n}\r\n\r\nexport interface NativeContextParams {\r\n model: string;\r\n /**\r\n * Chat template to override the default one from the model.\r\n */\r\n chat_template?: string;\r\n\r\n is_model_asset?: boolean;\r\n use_progress_callback?: boolean;\r\n\r\n n_ctx?: number;\r\n n_batch?: number;\r\n n_ubatch?: number;\r\n\r\n n_threads?: number;\r\n\r\n /**\r\n * Number of layers to store in VRAM (Currently only for iOS)\r\n */\r\n n_gpu_layers?: number;\r\n /**\r\n * Skip GPU devices (iOS only)\r\n */\r\n no_gpu_devices?: boolean;\r\n\r\n /**\r\n * Enable flash attention, only recommended in GPU device (Experimental in llama.cpp)\r\n */\r\n flash_attn?: boolean;\r\n\r\n /**\r\n * KV cache data type for the K (Experimental in llama.cpp)\r\n */\r\n cache_type_k?: string;\r\n /**\r\n * KV cache data type for the V (Experimental in llama.cpp)\r\n */\r\n cache_type_v?: string;\r\n\r\n use_mlock?: boolean;\r\n use_mmap?: boolean;\r\n vocab_only?: boolean;\r\n\r\n /**\r\n * Single LoRA adapter path\r\n */\r\n lora?: string;\r\n /**\r\n * Single LoRA adapter scale\r\n */\r\n lora_scaled?: number;\r\n /**\r\n * LoRA adapter list\r\n */\r\n lora_list?: Array<{ path: string; scaled?: number }>;\r\n\r\n rope_freq_base?: number;\r\n rope_freq_scale?: number;\r\n\r\n pooling_type?: number;\r\n\r\n /**\r\n * Enable context shifting to handle prompts larger than context size\r\n */\r\n ctx_shift?: boolean;\r\n\r\n /**\r\n * Use a unified buffer across the input sequences when computing the attention.\r\n * Try to disable when n_seq_max > 1 for improved performance when the sequences do not share a large prefix.\r\n */\r\n kv_unified?: boolean;\r\n\r\n /**\r\n * Use full-size SWA cache (https://github.com/ggml-org/llama.cpp/pull/13194#issuecomment-2868343055)\r\n */\r\n swa_full?: boolean;\r\n\r\n /**\r\n * Number of layers to keep MoE weights on CPU\r\n */\r\n n_cpu_moe?: number;\r\n\r\n // Embedding params\r\n embedding?: boolean;\r\n embd_normalize?: number;\r\n}\r\n\r\nexport interface NativeCompletionParams {\r\n prompt: string;\r\n n_threads?: number;\r\n /**\r\n * Enable Jinja. Default: true if supported by the model\r\n */\r\n jinja?: boolean;\r\n /**\r\n * JSON schema for convert to grammar for structured JSON output.\r\n * It will be override by grammar if both are set.\r\n */\r\n json_schema?: string;\r\n /**\r\n * Set grammar for grammar-based sampling. Default: no grammar\r\n */\r\n grammar?: string;\r\n /**\r\n * Lazy grammar sampling, trigger by grammar_triggers. Default: false\r\n */\r\n grammar_lazy?: boolean;\r\n /**\r\n * Enable thinking if jinja is enabled. Default: true\r\n */\r\n enable_thinking?: boolean;\r\n /**\r\n * Force thinking to be open. Default: false\r\n */\r\n thinking_forced_open?: boolean;\r\n /**\r\n * Lazy grammar triggers. Default: []\r\n */\r\n grammar_triggers?: Array<{\r\n type: number;\r\n value: string;\r\n token: number;\r\n }>;\r\n preserved_tokens?: Array<string>;\r\n chat_format?: number;\r\n reasoning_format?: string;\r\n /**\r\n * Path to an image file to process before generating text.\r\n * When provided, the image will be processed and added to the context.\r\n * Requires multimodal support to be enabled via initMultimodal.\r\n */\r\n media_paths?: Array<string>;\r\n /**\r\n * Specify a JSON array of stopping strings.\r\n * These words will not be included in the completion, so make sure to add them to the prompt for the next iteration. Default: `[]`\r\n */\r\n stop?: Array<string>;\r\n /**\r\n * Set the maximum number of tokens to predict when generating text.\r\n * **Note:** May exceed the set limit slightly if the last token is a partial multibyte character.\r\n * When 0,no tokens will be generated but the prompt is evaluated into the cache. Default: `-1`, where `-1` is infinity.\r\n */\r\n n_predict?: number;\r\n /**\r\n * If greater than 0, the response also contains the probabilities of top N tokens for each generated token given the sampling settings.\r\n * Note that for temperature < 0 the tokens are sampled greedily but token probabilities are still being calculated via a simple softmax of the logits without considering any other sampler settings.\r\n * Default: `0`\r\n */\r\n n_probs?: number;\r\n /**\r\n * Limit the next token selection to the K most probable tokens. Default: `40`\r\n */\r\n top_k?: number;\r\n /**\r\n * Limit the next token selection to a subset of tokens with a cumulative probability above a threshold P. Default: `0.95`\r\n */\r\n top_p?: number;\r\n /**\r\n * The minimum probability for a token to be considered, relative to the probability of the most likely token. Default: `0.05`\r\n */\r\n min_p?: number;\r\n /**\r\n * Set the chance for token removal via XTC sampler. Default: `0.0`, which is disabled.\r\n */\r\n xtc_probability?: number;\r\n /**\r\n * Set a minimum probability threshold for tokens to be removed via XTC sampler. Default: `0.1` (> `0.5` disables XTC)\r\n */\r\n xtc_threshold?: number;\r\n /**\r\n * Enable locally typical sampling with parameter p. Default: `1.0`, which is disabled.\r\n */\r\n typical_p?: number;\r\n /**\r\n * Adjust the randomness of the generated text. Default: `0.8`\r\n */\r\n temperature?: number;\r\n /**\r\n * Last n tokens to consider for penalizing repetition. Default: `64`, where `0` is disabled and `-1` is ctx-size.\r\n */\r\n penalty_last_n?: number;\r\n /**\r\n * Control the repetition of token sequences in the generated text. Default: `1.0`\r\n */\r\n penalty_repeat?: number;\r\n /**\r\n * Repeat alpha frequency penalty. Default: `0.0`, which is disabled.\r\n */\r\n penalty_freq?: number;\r\n /**\r\n * Repeat alpha presence penalty. Default: `0.0`, which is disabled.\r\n */\r\n penalty_present?: number;\r\n /**\r\n * Enable Mirostat sampling, controlling perplexity during text generation. Default: `0`, where `0` is disabled, `1` is Mirostat, and `2` is Mirostat 2.0.\r\n */\r\n mirostat?: number;\r\n /**\r\n * Set the Mirostat target entropy, parameter tau. Default: `5.0`\r\n */\r\n mirostat_tau?: number;\r\n /**\r\n * Set the Mirostat learning rate, parameter eta. Default: `0.1`\r\n */\r\n mirostat_eta?: number;\r\n /**\r\n * Set the DRY (Don't Repeat Yourself) repetition penalty multiplier. Default: `0.0`, which is disabled.\r\n */\r\n dry_multiplier?: number;\r\n /**\r\n * Set the DRY repetition penalty base value. Default: `1.75`\r\n */\r\n dry_base?: number;\r\n /**\r\n * Tokens that extend repetition beyond this receive exponentially increasing penalty: multiplier * base ^ (length of repeating sequence before token - allowed length). Default: `2`\r\n */\r\n dry_allowed_length?: number;\r\n /**\r\n * How many tokens to scan for repetitions. Default: `-1`, where `0` is disabled and `-1` is context size.\r\n */\r\n dry_penalty_last_n?: number;\r\n /**\r\n * Specify an array of sequence breakers for DRY sampling. Only a JSON array of strings is accepted. Default: `['\\n', ':', '\"', '*']`\r\n */\r\n dry_sequence_breakers?: Array<string>;\r\n /**\r\n * Top n sigma sampling as described in academic paper \"Top-nσ: Not All Logits Are You Need\" https://arxiv.org/pdf/2411.07641. Default: `-1.0` (Disabled)\r\n */\r\n top_n_sigma?: number;\r\n\r\n /**\r\n * Ignore end of stream token and continue generating. Default: `false`\r\n */\r\n ignore_eos?: boolean;\r\n /**\r\n * Modify the likelihood of a token appearing in the generated text completion.\r\n * For example, use `\"logit_bias\": [[15043,1.0]]` to increase the likelihood of the token 'Hello', or `\"logit_bias\": [[15043,-1.0]]` to decrease its likelihood.\r\n * Setting the value to false, `\"logit_bias\": [[15043,false]]` ensures that the token `Hello` is never produced. The tokens can also be represented as strings,\r\n * e.g.`[[\"Hello, World!\",-0.5]]` will reduce the likelihood of all the individual tokens that represent the string `Hello, World!`, just like the `presence_penalty` does.\r\n * Default: `[]`\r\n */\r\n logit_bias?: Array<Array<number>>;\r\n /**\r\n * Set the random number generator (RNG) seed. Default: `-1`, which is a random seed.\r\n */\r\n seed?: number;\r\n\r\n /**\r\n * Guide tokens for the completion.\r\n * Help prevent hallucinations by forcing the TTS to use the correct words.\r\n * Default: `[]`\r\n */\r\n guide_tokens?: Array<number>;\r\n\r\n emit_partial_completion: boolean;\r\n}\r\n\r\nexport interface NativeCompletionTokenProbItem {\r\n tok_str: string;\r\n prob: number;\r\n}\r\n\r\nexport interface NativeCompletionTokenProb {\r\n content: string;\r\n probs: Array<NativeCompletionTokenProbItem>;\r\n}\r\n\r\nexport interface NativeCompletionResultTimings {\r\n prompt_n: number;\r\n prompt_ms: number;\r\n prompt_per_token_ms: number;\r\n prompt_per_second: number;\r\n predicted_n: number;\r\n predicted_ms: number;\r\n predicted_per_token_ms: number;\r\n predicted_per_second: number;\r\n}\r\n\r\nexport interface NativeCompletionResult {\r\n /**\r\n * Original text (Ignored reasoning_content / tool_calls)\r\n */\r\n text: string;\r\n /**\r\n * Reasoning content (parsed for reasoning model)\r\n */\r\n reasoning_content: string;\r\n /**\r\n * Tool calls\r\n */\r\n tool_calls: Array<{\r\n type: 'function';\r\n function: {\r\n name: string;\r\n arguments: string;\r\n };\r\n id?: string;\r\n }>;\r\n /**\r\n * Content text (Filtered text by reasoning_content / tool_calls)\r\n */\r\n content: string;\r\n\r\n chat_format: number;\r\n\r\n tokens_predicted: number;\r\n tokens_evaluated: number;\r\n truncated: boolean;\r\n stopped_eos: boolean;\r\n stopped_word: string;\r\n stopped_limit: number;\r\n stopping_word: string;\r\n context_full: boolean;\r\n interrupted: boolean;\r\n tokens_cached: number;\r\n timings: NativeCompletionResultTimings;\r\n\r\n completion_probabilities?: Array<NativeCompletionTokenProb>;\r\n audio_tokens?: Array<number>;\r\n}\r\n\r\nexport interface NativeTokenizeResult {\r\n tokens: Array<number>;\r\n /**\r\n * Whether the tokenization contains images\r\n */\r\n has_images: boolean;\r\n /**\r\n * Bitmap hashes of the images\r\n */\r\n bitmap_hashes: Array<number>;\r\n /**\r\n * Chunk positions of the text and images\r\n */\r\n chunk_pos: Array<number>;\r\n /**\r\n * Chunk positions of the images\r\n */\r\n chunk_pos_images: Array<number>;\r\n}\r\n\r\nexport interface NativeEmbeddingResult {\r\n embedding: Array<number>;\r\n}\r\n\r\nexport interface NativeLlamaContext {\r\n contextId: number;\r\n model: {\r\n desc: string;\r\n size: number;\r\n nEmbd: number;\r\n nParams: number;\r\n chatTemplates: {\r\n llamaChat: boolean; // Chat template in llama-chat.cpp\r\n minja: {\r\n // Chat template supported by minja.hpp\r\n default: boolean;\r\n defaultCaps: {\r\n tools: boolean;\r\n toolCalls: boolean;\r\n toolResponses: boolean;\r\n systemRole: boolean;\r\n parallelToolCalls: boolean;\r\n toolCallId: boolean;\r\n };\r\n toolUse: boolean;\r\n toolUseCaps: {\r\n tools: boolean;\r\n toolCalls: boolean;\r\n toolResponses: boolean;\r\n systemRole: boolean;\r\n parallelToolCalls: boolean;\r\n toolCallId: boolean;\r\n };\r\n };\r\n };\r\n metadata: Object;\r\n isChatTemplateSupported: boolean; // Deprecated\r\n };\r\n /**\r\n * Loaded library name for Android\r\n */\r\n androidLib?: string;\r\n gpu: boolean;\r\n reasonNoGPU: string;\r\n}\r\n\r\nexport interface NativeSessionLoadResult {\r\n tokens_loaded: number;\r\n prompt: string;\r\n}\r\n\r\nexport interface NativeLlamaMessagePart {\r\n type: 'text';\r\n text: string;\r\n}\r\n\r\nexport interface NativeLlamaChatMessage {\r\n role: string;\r\n content: string | Array<NativeLlamaMessagePart>;\r\n}\r\n\r\nexport interface FormattedChatResult {\r\n type: 'jinja' | 'llama-chat';\r\n prompt: string;\r\n has_media: boolean;\r\n media_paths?: Array<string>;\r\n}\r\n\r\nexport interface JinjaFormattedChatResult extends FormattedChatResult {\r\n chat_format?: number;\r\n grammar?: string;\r\n grammar_lazy?: boolean;\r\n grammar_triggers?: Array<{\r\n type: number;\r\n value: string;\r\n token: number;\r\n }>;\r\n thinking_forced_open?: boolean;\r\n preserved_tokens?: Array<string>;\r\n additional_stops?: Array<string>;\r\n}\r\n\r\nexport interface NativeImageProcessingResult {\r\n success: boolean;\r\n prompt: string;\r\n error?: string;\r\n}\r\n\r\nexport interface NativeRerankParams {\r\n normalize?: number;\r\n}\r\n\r\nexport interface NativeRerankResult {\r\n score: number;\r\n index: number;\r\n}\r\n\r\n// High-level types for the plugin interface\r\nexport interface LlamaCppMessagePart {\r\n type: string;\r\n text?: string;\r\n image_url?: {\r\n url?: string;\r\n };\r\n input_audio?: {\r\n format: string;\r\n data?: string;\r\n url?: string;\r\n };\r\n}\r\n\r\nexport interface LlamaCppOAICompatibleMessage {\r\n role: string;\r\n content?: string | LlamaCppMessagePart[];\r\n}\r\n\r\nexport interface ToolCall {\r\n type: 'function';\r\n id?: string;\r\n function: {\r\n name: string;\r\n arguments: string; // JSON string\r\n };\r\n}\r\n\r\nexport interface TokenData {\r\n token: string;\r\n completion_probabilities?: Array<NativeCompletionTokenProb>;\r\n // Parsed content from accumulated text\r\n content?: string;\r\n reasoning_content?: string;\r\n tool_calls?: Array<ToolCall>;\r\n accumulated_text?: string;\r\n}\r\n\r\nexport interface ContextParams extends Omit<\r\n NativeContextParams,\r\n 'cache_type_k' | 'cache_type_v' | 'pooling_type'\r\n> {\r\n cache_type_k?:\r\n | 'f16'\r\n | 'f32'\r\n | 'q8_0'\r\n | 'q4_0'\r\n | 'q4_1'\r\n | 'iq4_nl'\r\n | 'q5_0'\r\n | 'q5_1';\r\n cache_type_v?:\r\n | 'f16'\r\n | 'f32'\r\n | 'q8_0'\r\n | 'q4_0'\r\n | 'q4_1'\r\n | 'iq4_nl'\r\n | 'q5_0'\r\n | 'q5_1';\r\n pooling_type?: 'none' | 'mean' | 'cls' | 'last' | 'rank';\r\n}\r\n\r\nexport interface EmbeddingParams extends NativeEmbeddingParams {}\r\n\r\nexport interface RerankParams {\r\n normalize?: number;\r\n}\r\n\r\nexport interface RerankResult {\r\n score: number;\r\n index: number;\r\n document?: string;\r\n}\r\n\r\nexport interface CompletionResponseFormat {\r\n type: 'text' | 'json_object' | 'json_schema';\r\n json_schema?: {\r\n strict?: boolean;\r\n schema: object;\r\n };\r\n schema?: object; // for json_object type\r\n}\r\n\r\nexport interface CompletionBaseParams {\r\n prompt?: string;\r\n messages?: LlamaCppOAICompatibleMessage[];\r\n chatTemplate?: string; // deprecated\r\n chat_template?: string;\r\n jinja?: boolean;\r\n tools?: object;\r\n parallel_tool_calls?: object;\r\n tool_choice?: string;\r\n response_format?: CompletionResponseFormat;\r\n media_paths?: string[];\r\n add_generation_prompt?: boolean;\r\n /*\r\n * Timestamp in seconds since epoch to apply to chat template's strftime_now\r\n */\r\n now?: string | number;\r\n chat_template_kwargs?: Record<string, string>;\r\n /**\r\n * Prefill text to be used for chat parsing (Generation Prompt + Content)\r\n * Used for if last assistant message is for prefill purpose\r\n */\r\n prefill_text?: string;\r\n}\r\n\r\nexport interface CompletionParams extends Omit<\r\n NativeCompletionParams,\r\n 'emit_partial_completion' | 'prompt'\r\n> {\r\n prompt?: string;\r\n messages?: LlamaCppOAICompatibleMessage[];\r\n chatTemplate?: string; // deprecated\r\n chat_template?: string;\r\n jinja?: boolean;\r\n tools?: object;\r\n parallel_tool_calls?: object;\r\n tool_choice?: string;\r\n response_format?: CompletionResponseFormat;\r\n media_paths?: string[];\r\n add_generation_prompt?: boolean;\r\n /*\r\n * Timestamp in seconds since epoch to apply to chat template's strftime_now\r\n */\r\n now?: string | number;\r\n chat_template_kwargs?: Record<string, string>;\r\n /**\r\n * Prefill text to be used for chat parsing (Generation Prompt + Content)\r\n * Used for if last assistant message is for prefill purpose\r\n */\r\n prefill_text?: string;\r\n}\r\n\r\nexport interface BenchResult {\r\n modelDesc: string;\r\n modelSize: number;\r\n modelNParams: number;\r\n ppAvg: number;\r\n ppStd: number;\r\n tgAvg: number;\r\n tgStd: number;\r\n}\r\n\r\n// Main plugin interface\r\nexport interface LlamaCppPlugin {\r\n // Core initialization and management\r\n toggleNativeLog(options: { enabled: boolean }): Promise<void>;\r\n setContextLimit(options: { limit: number }): Promise<void>;\r\n modelInfo(options: { path: string; skip?: string[] }): Promise<Object>;\r\n initContext(options: { contextId: number; params: NativeContextParams }): Promise<NativeLlamaContext>;\r\n releaseContext(options: { contextId: number }): Promise<void>;\r\n releaseAllContexts(): Promise<void>;\r\n\r\n // Chat and completion\r\n getFormattedChat(options: {\r\n contextId: number;\r\n messages: string;\r\n chatTemplate?: string;\r\n params?: {\r\n jinja?: boolean;\r\n json_schema?: string;\r\n tools?: string;\r\n parallel_tool_calls?: string;\r\n tool_choice?: string;\r\n enable_thinking?: boolean;\r\n add_generation_prompt?: boolean;\r\n now?: string;\r\n chat_template_kwargs?: string;\r\n };\r\n }): Promise<JinjaFormattedChatResult | string>;\r\n\r\n completion(options: {\r\n contextId: number;\r\n params: NativeCompletionParams;\r\n }): Promise<NativeCompletionResult>;\r\n\r\n stopCompletion(options: { contextId: number }): Promise<void>;\r\n\r\n // Session management\r\n loadSession(options: {\r\n contextId: number;\r\n filepath: string;\r\n }): Promise<NativeSessionLoadResult>;\r\n\r\n saveSession(options: {\r\n contextId: number;\r\n filepath: string;\r\n size: number;\r\n }): Promise<number>;\r\n\r\n // Tokenization\r\n tokenize(options: {\r\n contextId: number;\r\n text: string;\r\n imagePaths?: Array<string>;\r\n }): Promise<NativeTokenizeResult>;\r\n\r\n detokenize(options: {\r\n contextId: number;\r\n tokens: number[];\r\n }): Promise<string>;\r\n\r\n // Embeddings and reranking\r\n embedding(options: {\r\n contextId: number;\r\n text: string;\r\n params: NativeEmbeddingParams;\r\n }): Promise<NativeEmbeddingResult>;\r\n\r\n rerank(options: {\r\n contextId: number;\r\n query: string;\r\n documents: Array<string>;\r\n params?: NativeRerankParams;\r\n }): Promise<Array<NativeRerankResult>>;\r\n\r\n // Benchmarking\r\n bench(options: {\r\n contextId: number;\r\n pp: number;\r\n tg: number;\r\n pl: number;\r\n nr: number;\r\n }): Promise<string>;\r\n\r\n // LoRA adapters\r\n applyLoraAdapters(options: {\r\n contextId: number;\r\n loraAdapters: Array<{ path: string; scaled?: number }>;\r\n }): Promise<void>;\r\n\r\n removeLoraAdapters(options: { contextId: number }): Promise<void>;\r\n\r\n getLoadedLoraAdapters(options: {\r\n contextId: number;\r\n }): Promise<Array<{ path: string; scaled?: number }>>;\r\n\r\n // Multimodal methods\r\n initMultimodal(options: {\r\n contextId: number;\r\n params: {\r\n path: string;\r\n use_gpu: boolean;\r\n };\r\n }): Promise<boolean>;\r\n\r\n isMultimodalEnabled(options: {\r\n contextId: number;\r\n }): Promise<boolean>;\r\n\r\n getMultimodalSupport(options: {\r\n contextId: number;\r\n }): Promise<{\r\n vision: boolean;\r\n audio: boolean;\r\n }>;\r\n\r\n releaseMultimodal(options: {\r\n contextId: number;\r\n }): Promise<void>;\r\n\r\n // TTS methods\r\n initVocoder(options: {\r\n contextId: number;\r\n params: {\r\n path: string;\r\n n_batch?: number;\r\n };\r\n }): Promise<boolean>;\r\n\r\n isVocoderEnabled(options: { contextId: number }): Promise<boolean>;\r\n\r\n getFormattedAudioCompletion(options: {\r\n contextId: number;\r\n speakerJsonStr: string;\r\n textToSpeak: string;\r\n }): Promise<{\r\n prompt: string;\r\n grammar?: string;\r\n }>;\r\n\r\n getAudioCompletionGuideTokens(options: {\r\n contextId: number;\r\n textToSpeak: string;\r\n }): Promise<Array<number>>;\r\n\r\n decodeAudioTokens(options: {\r\n contextId: number;\r\n tokens: number[];\r\n }): Promise<Array<number>>;\r\n\r\n releaseVocoder(options: { contextId: number }): Promise<void>;\r\n\r\n // Events\r\n addListener(eventName: string, listenerFunc: (data: any) => void): Promise<void>;\r\n removeAllListeners(eventName: string): Promise<void>;\r\n}\r\n"]}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["// Native parameter types that match llama.rn exactly\r\nexport interface NativeEmbeddingParams {\r\n embd_normalize?: number;\r\n}\r\n\r\nexport interface NativeContextParams {\r\n model: string;\r\n /**\r\n * Chat template to override the default one from the model.\r\n */\r\n chat_template?: string;\r\n\r\n is_model_asset?: boolean;\r\n use_progress_callback?: boolean;\r\n\r\n n_ctx?: number;\r\n n_batch?: number;\r\n n_ubatch?: number;\r\n\r\n n_threads?: number;\r\n\r\n /**\r\n * Path to draft model for speculative decoding (mobile optimization)\r\n */\r\n draft_model?: string;\r\n /**\r\n * Number of tokens to predict speculatively (default: 3 for mobile)\r\n */\r\n speculative_samples?: number;\r\n /**\r\n * Enable mobile-optimized speculative decoding\r\n */\r\n mobile_speculative?: boolean;\r\n\r\n /**\r\n * Number of layers to store in VRAM (Currently only for iOS)\r\n */\r\n n_gpu_layers?: number;\r\n /**\r\n * Skip GPU devices (iOS only)\r\n */\r\n no_gpu_devices?: boolean;\r\n\r\n /**\r\n * Enable flash attention, only recommended in GPU device (Experimental in llama.cpp)\r\n */\r\n flash_attn?: boolean;\r\n\r\n /**\r\n * KV cache data type for the K (Experimental in llama.cpp)\r\n */\r\n cache_type_k?: string;\r\n /**\r\n * KV cache data type for the V (Experimental in llama.cpp)\r\n */\r\n cache_type_v?: string;\r\n\r\n use_mlock?: boolean;\r\n use_mmap?: boolean;\r\n vocab_only?: boolean;\r\n\r\n /**\r\n * Single LoRA adapter path\r\n */\r\n lora?: string;\r\n /**\r\n * Single LoRA adapter scale\r\n */\r\n lora_scaled?: number;\r\n /**\r\n * LoRA adapter list\r\n */\r\n lora_list?: Array<{ path: string; scaled?: number }>;\r\n\r\n rope_freq_base?: number;\r\n rope_freq_scale?: number;\r\n\r\n pooling_type?: number;\r\n\r\n /**\r\n * Enable context shifting to handle prompts larger than context size\r\n */\r\n ctx_shift?: boolean;\r\n\r\n /**\r\n * Use a unified buffer across the input sequences when computing the attention.\r\n * Try to disable when n_seq_max > 1 for improved performance when the sequences do not share a large prefix.\r\n */\r\n kv_unified?: boolean;\r\n\r\n /**\r\n * Use full-size SWA cache (https://github.com/ggml-org/llama.cpp/pull/13194#issuecomment-2868343055)\r\n */\r\n swa_full?: boolean;\r\n\r\n /**\r\n * Number of layers to keep MoE weights on CPU\r\n */\r\n n_cpu_moe?: number;\r\n\r\n // Embedding params\r\n embedding?: boolean;\r\n embd_normalize?: number;\r\n}\r\n\r\nexport interface NativeCompletionParams {\r\n prompt: string;\r\n n_threads?: number;\r\n /**\r\n * Enable Jinja. Default: true if supported by the model\r\n */\r\n jinja?: boolean;\r\n /**\r\n * JSON schema for convert to grammar for structured JSON output.\r\n * It will be override by grammar if both are set.\r\n */\r\n json_schema?: string;\r\n /**\r\n * Set grammar for grammar-based sampling (GBNF format). Default: no grammar\r\n * This will override json_schema if both are provided.\r\n */\r\n grammar?: string;\r\n /**\r\n * Lazy grammar sampling, trigger by grammar_triggers. Default: false\r\n */\r\n grammar_lazy?: boolean;\r\n /**\r\n * Enable thinking if jinja is enabled. Default: true\r\n */\r\n enable_thinking?: boolean;\r\n /**\r\n * Force thinking to be open. Default: false\r\n */\r\n thinking_forced_open?: boolean;\r\n /**\r\n * Lazy grammar triggers. Default: []\r\n */\r\n grammar_triggers?: Array<{\r\n type: number;\r\n value: string;\r\n token: number;\r\n }>;\r\n preserved_tokens?: Array<string>;\r\n chat_format?: number;\r\n reasoning_format?: string;\r\n /**\r\n * Path to an image file to process before generating text.\r\n * When provided, the image will be processed and added to the context.\r\n * Requires multimodal support to be enabled via initMultimodal.\r\n */\r\n media_paths?: Array<string>;\r\n /**\r\n * Specify a JSON array of stopping strings.\r\n * These words will not be included in the completion, so make sure to add them to the prompt for the next iteration. Default: `[]`\r\n */\r\n stop?: Array<string>;\r\n /**\r\n * Set the maximum number of tokens to predict when generating text.\r\n * **Note:** May exceed the set limit slightly if the last token is a partial multibyte character.\r\n * When 0,no tokens will be generated but the prompt is evaluated into the cache. Default: `-1`, where `-1` is infinity.\r\n */\r\n n_predict?: number;\r\n /**\r\n * If greater than 0, the response also contains the probabilities of top N tokens for each generated token given the sampling settings.\r\n * Note that for temperature < 0 the tokens are sampled greedily but token probabilities are still being calculated via a simple softmax of the logits without considering any other sampler settings.\r\n * Default: `0`\r\n */\r\n n_probs?: number;\r\n /**\r\n * Limit the next token selection to the K most probable tokens. Default: `40`\r\n */\r\n top_k?: number;\r\n /**\r\n * Limit the next token selection to a subset of tokens with a cumulative probability above a threshold P. Default: `0.95`\r\n */\r\n top_p?: number;\r\n /**\r\n * The minimum probability for a token to be considered, relative to the probability of the most likely token. Default: `0.05`\r\n */\r\n min_p?: number;\r\n /**\r\n * Set the chance for token removal via XTC sampler. Default: `0.0`, which is disabled.\r\n */\r\n xtc_probability?: number;\r\n /**\r\n * Set a minimum probability threshold for tokens to be removed via XTC sampler. Default: `0.1` (> `0.5` disables XTC)\r\n */\r\n xtc_threshold?: number;\r\n /**\r\n * Enable locally typical sampling with parameter p. Default: `1.0`, which is disabled.\r\n */\r\n typical_p?: number;\r\n /**\r\n * Adjust the randomness of the generated text. Default: `0.8`\r\n */\r\n temperature?: number;\r\n /**\r\n * Last n tokens to consider for penalizing repetition. Default: `64`, where `0` is disabled and `-1` is ctx-size.\r\n */\r\n penalty_last_n?: number;\r\n /**\r\n * Control the repetition of token sequences in the generated text. Default: `1.0`\r\n */\r\n penalty_repeat?: number;\r\n /**\r\n * Repeat alpha frequency penalty. Default: `0.0`, which is disabled.\r\n */\r\n penalty_freq?: number;\r\n /**\r\n * Repeat alpha presence penalty. Default: `0.0`, which is disabled.\r\n */\r\n penalty_present?: number;\r\n /**\r\n * Enable Mirostat sampling, controlling perplexity during text generation. Default: `0`, where `0` is disabled, `1` is Mirostat, and `2` is Mirostat 2.0.\r\n */\r\n mirostat?: number;\r\n /**\r\n * Set the Mirostat target entropy, parameter tau. Default: `5.0`\r\n */\r\n mirostat_tau?: number;\r\n /**\r\n * Set the Mirostat learning rate, parameter eta. Default: `0.1`\r\n */\r\n mirostat_eta?: number;\r\n /**\r\n * Set the DRY (Don't Repeat Yourself) repetition penalty multiplier. Default: `0.0`, which is disabled.\r\n */\r\n dry_multiplier?: number;\r\n /**\r\n * Set the DRY repetition penalty base value. Default: `1.75`\r\n */\r\n dry_base?: number;\r\n /**\r\n * Tokens that extend repetition beyond this receive exponentially increasing penalty: multiplier * base ^ (length of repeating sequence before token - allowed length). Default: `2`\r\n */\r\n dry_allowed_length?: number;\r\n /**\r\n * How many tokens to scan for repetitions. Default: `-1`, where `0` is disabled and `-1` is context size.\r\n */\r\n dry_penalty_last_n?: number;\r\n /**\r\n * Specify an array of sequence breakers for DRY sampling. Only a JSON array of strings is accepted. Default: `['\\n', ':', '\"', '*']`\r\n */\r\n dry_sequence_breakers?: Array<string>;\r\n /**\r\n * Top n sigma sampling as described in academic paper \"Top-nσ: Not All Logits Are You Need\" https://arxiv.org/pdf/2411.07641. Default: `-1.0` (Disabled)\r\n */\r\n top_n_sigma?: number;\r\n\r\n /**\r\n * Ignore end of stream token and continue generating. Default: `false`\r\n */\r\n ignore_eos?: boolean;\r\n /**\r\n * Modify the likelihood of a token appearing in the generated text completion.\r\n * For example, use `\"logit_bias\": [[15043,1.0]]` to increase the likelihood of the token 'Hello', or `\"logit_bias\": [[15043,-1.0]]` to decrease its likelihood.\r\n * Setting the value to false, `\"logit_bias\": [[15043,false]]` ensures that the token `Hello` is never produced. The tokens can also be represented as strings,\r\n * e.g.`[[\"Hello, World!\",-0.5]]` will reduce the likelihood of all the individual tokens that represent the string `Hello, World!`, just like the `presence_penalty` does.\r\n * Default: `[]`\r\n */\r\n logit_bias?: Array<Array<number>>;\r\n /**\r\n * Set the random number generator (RNG) seed. Default: `-1`, which is a random seed.\r\n */\r\n seed?: number;\r\n\r\n /**\r\n * Guide tokens for the completion.\r\n * Help prevent hallucinations by forcing the TTS to use the correct words.\r\n * Default: `[]`\r\n */\r\n guide_tokens?: Array<number>;\r\n\r\n emit_partial_completion: boolean;\r\n}\r\n\r\nexport interface NativeCompletionTokenProbItem {\r\n tok_str: string;\r\n prob: number;\r\n}\r\n\r\nexport interface NativeCompletionTokenProb {\r\n content: string;\r\n probs: Array<NativeCompletionTokenProbItem>;\r\n}\r\n\r\nexport interface NativeCompletionResultTimings {\r\n prompt_n: number;\r\n prompt_ms: number;\r\n prompt_per_token_ms: number;\r\n prompt_per_second: number;\r\n predicted_n: number;\r\n predicted_ms: number;\r\n predicted_per_token_ms: number;\r\n predicted_per_second: number;\r\n}\r\n\r\nexport interface NativeCompletionResult {\r\n /**\r\n * Original text (Ignored reasoning_content / tool_calls)\r\n */\r\n text: string;\r\n /**\r\n * Reasoning content (parsed for reasoning model)\r\n */\r\n reasoning_content: string;\r\n /**\r\n * Tool calls (parsed from response)\r\n */\r\n tool_calls: Array<{\r\n type: 'function';\r\n function: {\r\n name: string;\r\n arguments: string; // JSON string of arguments\r\n };\r\n id?: string;\r\n }>;\r\n /**\r\n * Content text (Filtered text by reasoning_content / tool_calls)\r\n */\r\n content: string;\r\n\r\n chat_format: number;\r\n\r\n tokens_predicted: number;\r\n tokens_evaluated: number;\r\n truncated: boolean;\r\n stopped_eos: boolean;\r\n stopped_word: string;\r\n stopped_limit: number;\r\n stopping_word: string;\r\n context_full: boolean;\r\n interrupted: boolean;\r\n tokens_cached: number;\r\n timings: NativeCompletionResultTimings;\r\n\r\n completion_probabilities?: Array<NativeCompletionTokenProb>;\r\n audio_tokens?: Array<number>;\r\n}\r\n\r\nexport interface NativeTokenizeResult {\r\n tokens: Array<number>;\r\n /**\r\n * Whether the tokenization contains images\r\n */\r\n has_images: boolean;\r\n /**\r\n * Bitmap hashes of the images\r\n */\r\n bitmap_hashes: Array<number>;\r\n /**\r\n * Chunk positions of the text and images\r\n */\r\n chunk_pos: Array<number>;\r\n /**\r\n * Chunk positions of the images\r\n */\r\n chunk_pos_images: Array<number>;\r\n}\r\n\r\nexport interface NativeEmbeddingResult {\r\n embedding: Array<number>;\r\n}\r\n\r\nexport interface NativeLlamaContext {\r\n contextId: number;\r\n model: {\r\n desc: string;\r\n size: number;\r\n nEmbd: number;\r\n nParams: number;\r\n chatTemplates: {\r\n llamaChat: boolean; // Chat template in llama-chat.cpp\r\n minja: {\r\n // Chat template supported by minja.hpp\r\n default: boolean;\r\n defaultCaps: {\r\n tools: boolean;\r\n toolCalls: boolean;\r\n toolResponses: boolean;\r\n systemRole: boolean;\r\n parallelToolCalls: boolean;\r\n toolCallId: boolean;\r\n };\r\n toolUse: boolean;\r\n toolUseCaps: {\r\n tools: boolean;\r\n toolCalls: boolean;\r\n toolResponses: boolean;\r\n systemRole: boolean;\r\n parallelToolCalls: boolean;\r\n toolCallId: boolean;\r\n };\r\n };\r\n };\r\n metadata: Object;\r\n isChatTemplateSupported: boolean; // Deprecated\r\n };\r\n /**\r\n * Loaded library name for Android\r\n */\r\n androidLib?: string;\r\n gpu: boolean;\r\n reasonNoGPU: string;\r\n}\r\n\r\nexport interface NativeSessionLoadResult {\r\n tokens_loaded: number;\r\n prompt: string;\r\n}\r\n\r\nexport interface NativeLlamaMessagePart {\r\n type: 'text';\r\n text: string;\r\n}\r\n\r\nexport interface NativeLlamaChatMessage {\r\n role: string;\r\n content: string | Array<NativeLlamaMessagePart>;\r\n}\r\n\r\nexport interface FormattedChatResult {\r\n type: 'jinja' | 'llama-chat';\r\n prompt: string;\r\n has_media: boolean;\r\n media_paths?: Array<string>;\r\n}\r\n\r\nexport interface JinjaFormattedChatResult extends FormattedChatResult {\r\n chat_format?: number;\r\n grammar?: string;\r\n grammar_lazy?: boolean;\r\n grammar_triggers?: Array<{\r\n type: number;\r\n value: string;\r\n token: number;\r\n }>;\r\n thinking_forced_open?: boolean;\r\n preserved_tokens?: Array<string>;\r\n additional_stops?: Array<string>;\r\n}\r\n\r\nexport interface NativeImageProcessingResult {\r\n success: boolean;\r\n prompt: string;\r\n error?: string;\r\n}\r\n\r\nexport interface NativeRerankParams {\r\n normalize?: number;\r\n}\r\n\r\nexport interface NativeRerankResult {\r\n score: number;\r\n index: number;\r\n}\r\n\r\n// High-level types for the plugin interface\r\nexport interface LlamaCppMessagePart {\r\n type: string;\r\n text?: string;\r\n image_url?: {\r\n url?: string;\r\n };\r\n input_audio?: {\r\n format: string;\r\n data?: string;\r\n url?: string;\r\n };\r\n}\r\n\r\nexport interface LlamaCppOAICompatibleMessage {\r\n role: string;\r\n content?: string | LlamaCppMessagePart[];\r\n}\r\n\r\nexport interface ToolCall {\r\n type: 'function';\r\n id?: string;\r\n function: {\r\n name: string;\r\n arguments: string; // JSON string\r\n };\r\n}\r\n\r\nexport interface TokenData {\r\n token: string;\r\n completion_probabilities?: Array<NativeCompletionTokenProb>;\r\n // Parsed content from accumulated text\r\n content?: string;\r\n reasoning_content?: string;\r\n tool_calls?: Array<ToolCall>;\r\n accumulated_text?: string;\r\n}\r\n\r\nexport interface ContextParams extends Omit<\r\n NativeContextParams,\r\n 'cache_type_k' | 'cache_type_v' | 'pooling_type'\r\n> {\r\n cache_type_k?:\r\n | 'f16'\r\n | 'f32'\r\n | 'q8_0'\r\n | 'q4_0'\r\n | 'q4_1'\r\n | 'iq4_nl'\r\n | 'q5_0'\r\n | 'q5_1';\r\n cache_type_v?:\r\n | 'f16'\r\n | 'f32'\r\n | 'q8_0'\r\n | 'q4_0'\r\n | 'q4_1'\r\n | 'iq4_nl'\r\n | 'q5_0'\r\n | 'q5_1';\r\n pooling_type?: 'none' | 'mean' | 'cls' | 'last' | 'rank';\r\n}\r\n\r\nexport interface EmbeddingParams extends NativeEmbeddingParams {}\r\n\r\nexport interface RerankParams {\r\n normalize?: number;\r\n}\r\n\r\nexport interface RerankResult {\r\n score: number;\r\n index: number;\r\n document?: string;\r\n}\r\n\r\nexport interface CompletionResponseFormat {\r\n type: 'text' | 'json_object' | 'json_schema';\r\n json_schema?: {\r\n strict?: boolean;\r\n schema: object;\r\n };\r\n schema?: object; // for json_object type\r\n}\r\n\r\nexport interface CompletionBaseParams {\r\n prompt?: string;\r\n messages?: LlamaCppOAICompatibleMessage[];\r\n chatTemplate?: string; // deprecated\r\n chat_template?: string;\r\n jinja?: boolean;\r\n tools?: object;\r\n parallel_tool_calls?: object;\r\n tool_choice?: string;\r\n response_format?: CompletionResponseFormat;\r\n media_paths?: string[];\r\n add_generation_prompt?: boolean;\r\n /*\r\n * Timestamp in seconds since epoch to apply to chat template's strftime_now\r\n */\r\n now?: string | number;\r\n chat_template_kwargs?: Record<string, string>;\r\n /**\r\n * Prefill text to be used for chat parsing (Generation Prompt + Content)\r\n * Used for if last assistant message is for prefill purpose\r\n */\r\n prefill_text?: string;\r\n}\r\n\r\nexport interface CompletionParams extends Omit<\r\n NativeCompletionParams,\r\n 'emit_partial_completion' | 'prompt'\r\n> {\r\n prompt?: string;\r\n messages?: LlamaCppOAICompatibleMessage[];\r\n chatTemplate?: string; // deprecated\r\n chat_template?: string;\r\n jinja?: boolean;\r\n /**\r\n * GBNF grammar for structured output. Takes precedence over json_schema.\r\n */\r\n grammar?: string;\r\n tools?: object;\r\n parallel_tool_calls?: object;\r\n tool_choice?: string;\r\n response_format?: CompletionResponseFormat;\r\n media_paths?: string[];\r\n add_generation_prompt?: boolean;\r\n /*\r\n * Timestamp in seconds since epoch to apply to chat template's strftime_now\r\n */\r\n now?: string | number;\r\n chat_template_kwargs?: Record<string, string>;\r\n /**\r\n * Prefill text to be used for chat parsing (Generation Prompt + Content)\r\n * Used for if last assistant message is for prefill purpose\r\n */\r\n prefill_text?: string;\r\n}\r\n\r\nexport interface BenchResult {\r\n modelDesc: string;\r\n modelSize: number;\r\n modelNParams: number;\r\n ppAvg: number;\r\n ppStd: number;\r\n tgAvg: number;\r\n tgStd: number;\r\n}\r\n\r\n// Main plugin interface\r\nexport interface LlamaCppPlugin {\r\n // Core initialization and management\r\n toggleNativeLog(options: { enabled: boolean }): Promise<void>;\r\n setContextLimit(options: { limit: number }): Promise<void>;\r\n modelInfo(options: { path: string; skip?: string[] }): Promise<Object>;\r\n initContext(options: { contextId: number; params: NativeContextParams }): Promise<NativeLlamaContext>;\r\n releaseContext(options: { contextId: number }): Promise<void>;\r\n releaseAllContexts(): Promise<void>;\r\n\r\n // Chat and completion\r\n getFormattedChat(options: {\r\n contextId: number;\r\n messages: string;\r\n chatTemplate?: string;\r\n params?: {\r\n jinja?: boolean;\r\n json_schema?: string;\r\n tools?: string;\r\n parallel_tool_calls?: string;\r\n tool_choice?: string;\r\n enable_thinking?: boolean;\r\n add_generation_prompt?: boolean;\r\n now?: string;\r\n chat_template_kwargs?: string;\r\n };\r\n }): Promise<JinjaFormattedChatResult | string>;\r\n\r\n completion(options: {\r\n contextId: number;\r\n params: NativeCompletionParams;\r\n }): Promise<NativeCompletionResult>;\r\n\r\n stopCompletion(options: { contextId: number }): Promise<void>;\r\n\r\n // Session management\r\n loadSession(options: {\r\n contextId: number;\r\n filepath: string;\r\n }): Promise<NativeSessionLoadResult>;\r\n\r\n saveSession(options: {\r\n contextId: number;\r\n filepath: string;\r\n size: number;\r\n }): Promise<number>;\r\n\r\n // Tokenization\r\n tokenize(options: {\r\n contextId: number;\r\n text: string;\r\n imagePaths?: Array<string>;\r\n }): Promise<NativeTokenizeResult>;\r\n\r\n detokenize(options: {\r\n contextId: number;\r\n tokens: number[];\r\n }): Promise<string>;\r\n\r\n // Embeddings and reranking\r\n embedding(options: {\r\n contextId: number;\r\n text: string;\r\n params: NativeEmbeddingParams;\r\n }): Promise<NativeEmbeddingResult>;\r\n\r\n rerank(options: {\r\n contextId: number;\r\n query: string;\r\n documents: Array<string>;\r\n params?: NativeRerankParams;\r\n }): Promise<Array<NativeRerankResult>>;\r\n\r\n // Benchmarking\r\n bench(options: {\r\n contextId: number;\r\n pp: number;\r\n tg: number;\r\n pl: number;\r\n nr: number;\r\n }): Promise<string>;\r\n\r\n // LoRA adapters\r\n applyLoraAdapters(options: {\r\n contextId: number;\r\n loraAdapters: Array<{ path: string; scaled?: number }>;\r\n }): Promise<void>;\r\n\r\n removeLoraAdapters(options: { contextId: number }): Promise<void>;\r\n\r\n getLoadedLoraAdapters(options: {\r\n contextId: number;\r\n }): Promise<Array<{ path: string; scaled?: number }>>;\r\n\r\n // Multimodal methods\r\n initMultimodal(options: {\r\n contextId: number;\r\n params: {\r\n path: string;\r\n use_gpu: boolean;\r\n };\r\n }): Promise<boolean>;\r\n\r\n isMultimodalEnabled(options: {\r\n contextId: number;\r\n }): Promise<boolean>;\r\n\r\n getMultimodalSupport(options: {\r\n contextId: number;\r\n }): Promise<{\r\n vision: boolean;\r\n audio: boolean;\r\n }>;\r\n\r\n releaseMultimodal(options: {\r\n contextId: number;\r\n }): Promise<void>;\r\n\r\n // TTS methods\r\n initVocoder(options: {\r\n contextId: number;\r\n params: {\r\n path: string;\r\n n_batch?: number;\r\n };\r\n }): Promise<boolean>;\r\n\r\n isVocoderEnabled(options: { contextId: number }): Promise<boolean>;\r\n\r\n getFormattedAudioCompletion(options: {\r\n contextId: number;\r\n speakerJsonStr: string;\r\n textToSpeak: string;\r\n }): Promise<{\r\n prompt: string;\r\n grammar?: string;\r\n }>;\r\n\r\n getAudioCompletionGuideTokens(options: {\r\n contextId: number;\r\n textToSpeak: string;\r\n }): Promise<Array<number>>;\r\n\r\n decodeAudioTokens(options: {\r\n contextId: number;\r\n tokens: number[];\r\n }): Promise<Array<number>>;\r\n\r\n releaseVocoder(options: { contextId: number }): Promise<void>;\r\n\r\n // Model download and management\r\n downloadModel(options: {\r\n url: string;\r\n filename: string;\r\n }): Promise<string>;\r\n\r\n getDownloadProgress(options: {\r\n url: string;\r\n }): Promise<{\r\n progress: number;\r\n completed: boolean;\r\n failed: boolean;\r\n errorMessage?: string;\r\n localPath?: string;\r\n downloadedBytes: number;\r\n totalBytes: number;\r\n }>;\r\n\r\n cancelDownload(options: {\r\n url: string;\r\n }): Promise<boolean>;\r\n\r\n getAvailableModels(): Promise<Array<{\r\n name: string;\r\n path: string;\r\n size: number;\r\n }>>;\r\n\r\n // Grammar utilities\r\n convertJsonSchemaToGrammar(options: {\r\n schema: string;\r\n }): Promise<string>;\r\n\r\n // Events\r\n addListener(eventName: string, listenerFunc: (data: any) => void): Promise<void>;\r\n removeAllListeners(eventName: string): Promise<void>;\r\n}\r\n"]}
@@ -173,6 +173,28 @@ export declare function setContextLimit(limit: number): Promise<void>;
173
173
  export declare function loadLlamaModelInfo(model: string): Promise<Object>;
174
174
  export declare function initLlama({ model, is_model_asset: isModelAsset, pooling_type: poolingType, lora, lora_list: loraList, ...rest }: ContextParams, onProgress?: (progress: number) => void): Promise<LlamaContext>;
175
175
  export declare function releaseAllLlama(): Promise<void>;
176
+ export declare function downloadModel(url: string, filename: string): Promise<string>;
177
+ export declare function getDownloadProgress(url: string): Promise<{
178
+ progress: number;
179
+ completed: boolean;
180
+ failed: boolean;
181
+ errorMessage?: string;
182
+ localPath?: string;
183
+ downloadedBytes: number;
184
+ totalBytes: number;
185
+ }>;
186
+ export declare function cancelDownload(url: string): Promise<boolean>;
187
+ export declare function getAvailableModels(): Promise<Array<{
188
+ name: string;
189
+ path: string;
190
+ size: number;
191
+ }>>;
192
+ /**
193
+ * Convert a JSON schema to GBNF grammar format
194
+ * @param schema JSON schema object
195
+ * @returns Promise resolving to GBNF grammar string
196
+ */
197
+ export declare function convertJsonSchemaToGrammar(schema: object): Promise<string>;
176
198
  export declare const BuildInfo: {
177
199
  number: string;
178
200
  commit: string;
package/dist/esm/index.js CHANGED
@@ -39,6 +39,27 @@ const getJsonSchema = (responseFormat) => {
39
39
  }
40
40
  return null;
41
41
  };
42
+ // Utility function to convert JSON schema to GBNF grammar
43
+ const jsonSchemaToGrammar = async (schema) => {
44
+ // This will call the native method to convert JSON schema to GBNF
45
+ // For now, we'll return a basic implementation
46
+ try {
47
+ const result = await LlamaCpp.convertJsonSchemaToGrammar({ schema: JSON.stringify(schema) });
48
+ return result;
49
+ }
50
+ catch (error) {
51
+ console.warn('Failed to convert JSON schema to GBNF, using fallback:', error);
52
+ // Fallback for basic object structure
53
+ return `root ::= "{" ws object_content ws "}"
54
+ object_content ::= string_field ("," ws string_field)*
55
+ string_field ::= "\\"" [a-zA-Z_][a-zA-Z0-9_]* "\\"" ws ":" ws value
56
+ value ::= string | number | boolean | "null"
57
+ string ::= "\\"" [^"]* "\\""
58
+ number ::= "-"? [0-9]+ ("." [0-9]+)?
59
+ boolean ::= "true" | "false"
60
+ ws ::= [ \\t\\n]*`;
61
+ }
62
+ };
42
63
  export class LlamaContext {
43
64
  constructor({ contextId, gpu, reasonNoGPU, model }) {
44
65
  this.gpu = false;
@@ -217,10 +238,23 @@ export class LlamaContext {
217
238
  if (!nativeParams.media_paths && params.media_paths) {
218
239
  nativeParams.media_paths = params.media_paths;
219
240
  }
220
- if (nativeParams.response_format && !nativeParams.grammar) {
241
+ // Handle structured output and grammar
242
+ if (params.grammar) {
243
+ // Direct GBNF grammar takes precedence
244
+ nativeParams.grammar = params.grammar;
245
+ }
246
+ else if (nativeParams.response_format && !nativeParams.grammar) {
221
247
  const jsonSchema = getJsonSchema(params.response_format);
222
- if (jsonSchema)
223
- nativeParams.json_schema = JSON.stringify(jsonSchema);
248
+ if (jsonSchema) {
249
+ // Try to convert JSON schema to GBNF grammar
250
+ try {
251
+ nativeParams.grammar = await jsonSchemaToGrammar(jsonSchema);
252
+ }
253
+ catch (error) {
254
+ console.warn('Failed to convert JSON schema to grammar, falling back to json_schema parameter:', error);
255
+ nativeParams.json_schema = JSON.stringify(jsonSchema);
256
+ }
257
+ }
224
258
  }
225
259
  let tokenListener = callback &&
226
260
  LlamaCpp.addListener(EVENT_ON_TOKEN, (evt) => {
@@ -480,6 +514,14 @@ export async function initLlama(_a, onProgress) {
480
514
  console.warn(`[LlamaCpp] initLlama: Invalid cache V type: ${rest.cache_type_v}, falling back to f16`);
481
515
  delete rest.cache_type_v;
482
516
  }
517
+ // Log speculative decoding configuration if enabled
518
+ if (rest.draft_model) {
519
+ console.log(`🚀 Initializing with speculative decoding:
520
+ - Main model: ${path}
521
+ - Draft model: ${rest.draft_model}
522
+ - Speculative samples: ${rest.speculative_samples || 3}
523
+ - Mobile optimization: ${rest.mobile_speculative !== false ? 'enabled' : 'disabled'}`);
524
+ }
483
525
  const { gpu, reasonNoGPU, model: modelDetails, androidLib, } = await LlamaCpp.initContext({
484
526
  contextId,
485
527
  params: Object.assign({ model: path, is_model_asset: !!isModelAsset, use_progress_callback: !!onProgress, pooling_type: poolType, lora: loraPath, lora_list: loraAdapters }, rest),
@@ -499,6 +541,27 @@ export async function initLlama(_a, onProgress) {
499
541
  export async function releaseAllLlama() {
500
542
  return LlamaCpp.releaseAllContexts();
501
543
  }
544
+ // Model download and management functions
545
+ export async function downloadModel(url, filename) {
546
+ return LlamaCpp.downloadModel({ url, filename });
547
+ }
548
+ export async function getDownloadProgress(url) {
549
+ return LlamaCpp.getDownloadProgress({ url });
550
+ }
551
+ export async function cancelDownload(url) {
552
+ return LlamaCpp.cancelDownload({ url });
553
+ }
554
+ export async function getAvailableModels() {
555
+ return LlamaCpp.getAvailableModels();
556
+ }
557
+ /**
558
+ * Convert a JSON schema to GBNF grammar format
559
+ * @param schema JSON schema object
560
+ * @returns Promise resolving to GBNF grammar string
561
+ */
562
+ export async function convertJsonSchemaToGrammar(schema) {
563
+ return jsonSchemaToGrammar(schema);
564
+ }
502
565
  export const BuildInfo = {
503
566
  number: '1.0.0',
504
567
  commit: 'capacitor-llama-cpp',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerPlugin } from '@capacitor/core';\nimport type {\n NativeContextParams,\n NativeLlamaContext,\n NativeCompletionParams,\n NativeCompletionTokenProb,\n NativeCompletionResult,\n NativeTokenizeResult,\n NativeEmbeddingResult,\n NativeSessionLoadResult,\n NativeEmbeddingParams,\n NativeRerankParams,\n NativeRerankResult,\n NativeCompletionTokenProbItem,\n NativeCompletionResultTimings,\n JinjaFormattedChatResult,\n FormattedChatResult,\n NativeImageProcessingResult,\n NativeLlamaChatMessage,\n LlamaCppMessagePart,\n LlamaCppOAICompatibleMessage,\n ContextParams,\n EmbeddingParams,\n RerankParams,\n RerankResult,\n CompletionResponseFormat,\n CompletionParams,\n BenchResult,\n LlamaCppPlugin,\n} from './definitions';\n\n// Constants\nexport const LLAMACPP_MTMD_DEFAULT_MEDIA_MARKER = '<__media__>';\n\n// Event names\nconst EVENT_ON_INIT_CONTEXT_PROGRESS = '@LlamaCpp_onInitContextProgress';\nconst EVENT_ON_TOKEN = '@LlamaCpp_onToken';\nconst EVENT_ON_NATIVE_LOG = '@LlamaCpp_onNativeLog';\n\n// Register the plugin\nconst LlamaCpp = registerPlugin<LlamaCppPlugin>('LlamaCpp');\n\n// Log listeners management\nconst logListeners: Array<(level: string, text: string) => void> = [];\n\n// Set up native log listener\nLlamaCpp.addListener(EVENT_ON_NATIVE_LOG, (evt: { level: string; text: string }) => {\n logListeners.forEach((listener) => listener(evt.level, evt.text));\n});\n\n// Trigger unset to use default log callback\nLlamaCpp?.toggleNativeLog?.({ enabled: false })?.catch?.(() => {});\n\n// High-level types for the plugin interface\nexport type RNLlamaMessagePart = LlamaCppMessagePart;\nexport type RNLlamaOAICompatibleMessage = LlamaCppOAICompatibleMessage;\n\n// Re-export all types from definitions\nexport type {\n NativeContextParams,\n NativeLlamaContext,\n NativeCompletionParams,\n NativeCompletionTokenProb,\n NativeCompletionResult,\n NativeTokenizeResult,\n NativeEmbeddingResult,\n NativeSessionLoadResult,\n NativeEmbeddingParams,\n NativeRerankParams,\n NativeRerankResult,\n NativeCompletionTokenProbItem,\n NativeCompletionResultTimings,\n FormattedChatResult,\n JinjaFormattedChatResult,\n NativeImageProcessingResult,\n ContextParams,\n EmbeddingParams,\n RerankParams,\n RerankResult,\n CompletionResponseFormat,\n CompletionParams,\n BenchResult,\n};\n\nexport const RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER = LLAMACPP_MTMD_DEFAULT_MEDIA_MARKER;\n\nexport type ToolCall = {\n type: 'function';\n id?: string;\n function: {\n name: string;\n arguments: string; // JSON string\n };\n};\n\nexport type TokenData = {\n token: string;\n completion_probabilities?: Array<NativeCompletionTokenProb>;\n // Parsed content from accumulated text\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<ToolCall>;\n accumulated_text?: string;\n};\n\ntype TokenNativeEvent = {\n contextId: number;\n tokenResult: TokenData;\n};\n\nconst validCacheTypes = [\n 'f16',\n 'f32',\n 'bf16',\n 'q8_0',\n 'q4_0',\n 'q4_1',\n 'iq4_nl',\n 'q5_0',\n 'q5_1',\n];\n\nconst getJsonSchema = (responseFormat?: CompletionResponseFormat) => {\n if (responseFormat?.type === 'json_schema') {\n return responseFormat.json_schema?.schema;\n }\n if (responseFormat?.type === 'json_object') {\n return responseFormat.schema || {};\n }\n return null;\n};\n\nexport class LlamaContext {\n id: number;\n gpu: boolean = false;\n reasonNoGPU: string = '';\n model: NativeLlamaContext['model'];\n\n constructor({ contextId, gpu, reasonNoGPU, model }: NativeLlamaContext) {\n this.id = contextId;\n this.gpu = gpu;\n this.reasonNoGPU = reasonNoGPU;\n this.model = model;\n }\n\n /**\n * Load cached prompt & completion state from a file.\n */\n async loadSession(filepath: string): Promise<NativeSessionLoadResult> {\n let path = filepath;\n if (path.startsWith('file://')) path = path.slice(7);\n return LlamaCpp.loadSession({ contextId: this.id, filepath: path });\n }\n\n /**\n * Save current cached prompt & completion state to a file.\n */\n async saveSession(\n filepath: string,\n options?: { tokenSize: number },\n ): Promise<number> {\n return LlamaCpp.saveSession({ \n contextId: this.id, \n filepath, \n size: options?.tokenSize || -1 \n });\n }\n\n isLlamaChatSupported(): boolean {\n return !!this.model.chatTemplates.llamaChat;\n }\n\n isJinjaSupported(): boolean {\n const { minja } = this.model.chatTemplates;\n return !!minja?.toolUse || !!minja?.default;\n }\n\n async getFormattedChat(\n messages: RNLlamaOAICompatibleMessage[],\n template?: string | null,\n params?: {\n jinja?: boolean;\n response_format?: CompletionResponseFormat;\n tools?: object;\n parallel_tool_calls?: object;\n tool_choice?: string;\n enable_thinking?: boolean;\n add_generation_prompt?: boolean;\n now?: string | number;\n chat_template_kwargs?: Record<string, string>;\n },\n ): Promise<FormattedChatResult | JinjaFormattedChatResult> {\n const mediaPaths: string[] = [];\n const chat = messages.map((msg) => {\n if (Array.isArray(msg.content)) {\n const content = msg.content.map((part) => {\n // Handle multimodal content\n if (part.type === 'image_url') {\n let path = part.image_url?.url || '';\n if (path?.startsWith('file://')) path = path.slice(7);\n mediaPaths.push(path);\n return {\n type: 'text',\n text: RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER,\n };\n } else if (part.type === 'input_audio') {\n const { input_audio: audio } = part;\n if (!audio) throw new Error('input_audio is required');\n\n const { format } = audio;\n if (format != 'wav' && format != 'mp3') {\n throw new Error(`Unsupported audio format: ${format}`);\n }\n if (audio.url) {\n const path = audio.url.replace(/file:\\/\\//, '');\n mediaPaths.push(path);\n } else if (audio.data) {\n mediaPaths.push(audio.data);\n }\n return {\n type: 'text',\n text: RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER,\n };\n }\n return part;\n });\n\n return {\n ...msg,\n content,\n };\n }\n return msg;\n }) as NativeLlamaChatMessage[];\n\n const useJinja = this.isJinjaSupported() && params?.jinja;\n let tmpl;\n if (template) tmpl = template; // Force replace if provided\n const jsonSchema = getJsonSchema(params?.response_format);\n\n const result = await LlamaCpp.getFormattedChat({\n contextId: this.id,\n messages: JSON.stringify(chat),\n chatTemplate: tmpl,\n params: {\n jinja: useJinja,\n json_schema: jsonSchema ? JSON.stringify(jsonSchema) : undefined,\n tools: params?.tools ? JSON.stringify(params.tools) : undefined,\n parallel_tool_calls: params?.parallel_tool_calls\n ? JSON.stringify(params.parallel_tool_calls)\n : undefined,\n tool_choice: params?.tool_choice,\n enable_thinking: params?.enable_thinking ?? true,\n add_generation_prompt: params?.add_generation_prompt,\n now: typeof params?.now === 'number' ? params.now.toString() : params?.now,\n chat_template_kwargs: params?.chat_template_kwargs ? JSON.stringify(\n Object.entries(params.chat_template_kwargs).reduce((acc, [key, value]) => {\n acc[key] = JSON.stringify(value); // Each value is a stringified JSON object\n return acc;\n }, {} as Record<string, any>)\n ) : undefined,\n },\n });\n\n if (!useJinja) {\n return {\n type: 'llama-chat',\n prompt: result as string,\n has_media: mediaPaths.length > 0,\n media_paths: mediaPaths,\n };\n }\n const jinjaResult = result as JinjaFormattedChatResult;\n jinjaResult.type = 'jinja';\n jinjaResult.has_media = mediaPaths.length > 0;\n jinjaResult.media_paths = mediaPaths;\n return jinjaResult;\n }\n\n /**\n * Generate a completion based on the provided parameters\n * @param params Completion parameters including prompt or messages\n * @param callback Optional callback for token-by-token streaming\n * @returns Promise resolving to the completion result\n *\n * Note: For multimodal support, you can include an media_paths parameter.\n * This will process the images and add them to the context before generating text.\n * Multimodal support must be enabled via initMultimodal() first.\n */\n async completion(\n params: CompletionParams,\n callback?: (data: TokenData) => void,\n ): Promise<NativeCompletionResult> {\n const nativeParams = {\n ...params,\n prompt: params.prompt || '',\n emit_partial_completion: !!callback,\n };\n\n if (params.messages) {\n const formattedResult = await this.getFormattedChat(\n params.messages,\n params.chat_template || params.chatTemplate,\n {\n jinja: params.jinja,\n tools: params.tools,\n parallel_tool_calls: params.parallel_tool_calls,\n tool_choice: params.tool_choice,\n enable_thinking: params.enable_thinking,\n add_generation_prompt: params.add_generation_prompt,\n now: params.now,\n chat_template_kwargs: params.chat_template_kwargs,\n },\n );\n if (formattedResult.type === 'jinja') {\n const jinjaResult = formattedResult as JinjaFormattedChatResult;\n\n nativeParams.prompt = jinjaResult.prompt || '';\n if (typeof jinjaResult.chat_format === 'number')\n nativeParams.chat_format = jinjaResult.chat_format;\n if (jinjaResult.grammar) nativeParams.grammar = jinjaResult.grammar;\n if (typeof jinjaResult.grammar_lazy === 'boolean')\n nativeParams.grammar_lazy = jinjaResult.grammar_lazy;\n if (jinjaResult.grammar_triggers)\n nativeParams.grammar_triggers = jinjaResult.grammar_triggers;\n if (jinjaResult.preserved_tokens)\n nativeParams.preserved_tokens = jinjaResult.preserved_tokens;\n if (jinjaResult.additional_stops) {\n if (!nativeParams.stop) nativeParams.stop = [];\n nativeParams.stop.push(...jinjaResult.additional_stops);\n }\n if (jinjaResult.has_media) {\n nativeParams.media_paths = jinjaResult.media_paths;\n }\n } else if (formattedResult.type === 'llama-chat') {\n const llamaChatResult = formattedResult as FormattedChatResult;\n nativeParams.prompt = llamaChatResult.prompt || '';\n if (llamaChatResult.has_media) {\n nativeParams.media_paths = llamaChatResult.media_paths;\n }\n }\n } else {\n nativeParams.prompt = params.prompt || '';\n }\n\n // If media_paths were explicitly provided or extracted from messages, use them\n if (!nativeParams.media_paths && params.media_paths) {\n nativeParams.media_paths = params.media_paths;\n }\n\n if (nativeParams.response_format && !nativeParams.grammar) {\n const jsonSchema = getJsonSchema(params.response_format);\n if (jsonSchema) nativeParams.json_schema = JSON.stringify(jsonSchema);\n }\n\n let tokenListener: any =\n callback &&\n LlamaCpp.addListener(EVENT_ON_TOKEN, (evt: TokenNativeEvent) => {\n const { contextId, tokenResult } = evt;\n if (contextId !== this.id) return;\n callback(tokenResult);\n });\n\n if (!nativeParams.prompt) throw new Error('Prompt is required');\n\n const promise = LlamaCpp.completion({ contextId: this.id, params: nativeParams });\n return promise\n .then((completionResult) => {\n tokenListener?.remove();\n tokenListener = null;\n return completionResult;\n })\n .catch((err: any) => {\n tokenListener?.remove();\n tokenListener = null;\n throw err;\n });\n }\n\n stopCompletion(): Promise<void> {\n return LlamaCpp.stopCompletion({ contextId: this.id });\n }\n\n /**\n * Tokenize text or text with images\n * @param text Text to tokenize\n * @param params.media_paths Array of image paths to tokenize (if multimodal is enabled)\n * @returns Promise resolving to the tokenize result\n */\n tokenize(\n text: string,\n {\n media_paths: mediaPaths,\n }: {\n media_paths?: string[];\n } = {},\n ): Promise<NativeTokenizeResult> {\n return LlamaCpp.tokenize({ contextId: this.id, text, imagePaths: mediaPaths });\n }\n\n detokenize(tokens: number[]): Promise<string> {\n return LlamaCpp.detokenize({ contextId: this.id, tokens });\n }\n\n embedding(\n text: string,\n params?: EmbeddingParams,\n ): Promise<NativeEmbeddingResult> {\n return LlamaCpp.embedding({ contextId: this.id, text, params: params || {} });\n }\n\n /**\n * Rerank documents based on relevance to a query\n * @param query The query text to rank documents against\n * @param documents Array of document texts to rank\n * @param params Optional reranking parameters\n * @returns Promise resolving to an array of ranking results with scores and indices\n */\n async rerank(\n query: string,\n documents: string[],\n params?: RerankParams,\n ): Promise<RerankResult[]> {\n const results = await LlamaCpp.rerank({ \n contextId: this.id, \n query, \n documents, \n params: params || {} \n });\n\n // Sort by score descending and add document text if requested\n return results\n .map((result) => ({\n ...result,\n document: documents[result.index],\n }))\n .sort((a, b) => b.score - a.score);\n }\n\n async bench(\n pp: number,\n tg: number,\n pl: number,\n nr: number,\n ): Promise<BenchResult> {\n const result = await LlamaCpp.bench({ contextId: this.id, pp, tg, pl, nr });\n const [modelDesc, modelSize, modelNParams, ppAvg, ppStd, tgAvg, tgStd] =\n JSON.parse(result);\n return {\n modelDesc,\n modelSize,\n modelNParams,\n ppAvg,\n ppStd,\n tgAvg,\n tgStd,\n };\n }\n\n async applyLoraAdapters(\n loraList: Array<{ path: string; scaled?: number }>,\n ): Promise<void> {\n let loraAdapters: Array<{ path: string; scaled?: number }> = [];\n if (loraList)\n loraAdapters = loraList.map((l) => ({\n path: l.path.replace(/file:\\/\\//, ''),\n scaled: l.scaled,\n }));\n return LlamaCpp.applyLoraAdapters({ contextId: this.id, loraAdapters });\n }\n\n async removeLoraAdapters(): Promise<void> {\n return LlamaCpp.removeLoraAdapters({ contextId: this.id });\n }\n\n async getLoadedLoraAdapters(): Promise<\n Array<{ path: string; scaled?: number }>\n > {\n return LlamaCpp.getLoadedLoraAdapters({ contextId: this.id });\n }\n\n /**\n * Initialize multimodal support with a mmproj file\n * @param params Parameters for multimodal support\n * @param params.path Path to the multimodal projector file\n * @param params.use_gpu Whether to use GPU\n * @returns Promise resolving to true if initialization was successful\n */\n async initMultimodal({\n path,\n use_gpu: useGpu,\n }: {\n path: string;\n use_gpu?: boolean;\n }): Promise<boolean> {\n if (path.startsWith('file://')) path = path.slice(7);\n return LlamaCpp.initMultimodal({\n contextId: this.id,\n params: {\n path,\n use_gpu: useGpu ?? true,\n },\n });\n }\n\n /**\n * Check if multimodal support is enabled\n * @returns Promise resolving to true if multimodal is enabled\n */\n async isMultimodalEnabled(): Promise<boolean> {\n return await LlamaCpp.isMultimodalEnabled({ contextId: this.id });\n }\n\n /**\n * Check multimodal support\n * @returns Promise resolving to an object with vision and audio support\n */\n async getMultimodalSupport(): Promise<{\n vision: boolean;\n audio: boolean;\n }> {\n return await LlamaCpp.getMultimodalSupport({ contextId: this.id });\n }\n\n /**\n * Release multimodal support\n * @returns Promise resolving to void\n */\n async releaseMultimodal(): Promise<void> {\n return await LlamaCpp.releaseMultimodal({ contextId: this.id });\n }\n\n /**\n * Initialize TTS support with a vocoder model\n * @param params Parameters for TTS support\n * @param params.path Path to the vocoder model\n * @param params.n_batch Batch size for the vocoder model\n * @returns Promise resolving to true if initialization was successful\n */\n async initVocoder({ path, n_batch: nBatch }: { path: string; n_batch?: number }): Promise<boolean> {\n if (path.startsWith('file://')) path = path.slice(7);\n return await LlamaCpp.initVocoder({ \n contextId: this.id, \n params: { path, n_batch: nBatch } \n });\n }\n\n /**\n * Check if TTS support is enabled\n * @returns Promise resolving to true if TTS is enabled\n */\n async isVocoderEnabled(): Promise<boolean> {\n return await LlamaCpp.isVocoderEnabled({ contextId: this.id });\n }\n\n /**\n * Get a formatted audio completion prompt\n * @param speakerJsonStr JSON string representing the speaker\n * @param textToSpeak Text to speak\n * @returns Promise resolving to the formatted audio completion result with prompt and grammar\n */\n async getFormattedAudioCompletion(\n speaker: object | null,\n textToSpeak: string,\n ): Promise<{\n prompt: string;\n grammar?: string;\n }> {\n return await LlamaCpp.getFormattedAudioCompletion({\n contextId: this.id,\n speakerJsonStr: speaker ? JSON.stringify(speaker) : '',\n textToSpeak,\n });\n }\n\n /**\n * Get guide tokens for audio completion\n * @param textToSpeak Text to speak\n * @returns Promise resolving to the guide tokens\n */\n async getAudioCompletionGuideTokens(\n textToSpeak: string,\n ): Promise<Array<number>> {\n return await LlamaCpp.getAudioCompletionGuideTokens({ contextId: this.id, textToSpeak });\n }\n\n /**\n * Decode audio tokens\n * @param tokens Array of audio tokens\n * @returns Promise resolving to the decoded audio tokens\n */\n async decodeAudioTokens(tokens: number[]): Promise<Array<number>> {\n return await LlamaCpp.decodeAudioTokens({ contextId: this.id, tokens });\n }\n\n /**\n * Release TTS support\n * @returns Promise resolving to void\n */\n async releaseVocoder(): Promise<void> {\n return await LlamaCpp.releaseVocoder({ contextId: this.id });\n }\n\n async release(): Promise<void> {\n return LlamaCpp.releaseContext({ contextId: this.id });\n }\n}\n\nexport async function toggleNativeLog(enabled: boolean): Promise<void> {\n return LlamaCpp.toggleNativeLog({ enabled });\n}\n\nexport function addNativeLogListener(\n listener: (level: string, text: string) => void,\n): { remove: () => void } {\n logListeners.push(listener);\n return {\n remove: () => {\n logListeners.splice(logListeners.indexOf(listener), 1);\n },\n };\n}\n\nexport async function setContextLimit(limit: number): Promise<void> {\n return LlamaCpp.setContextLimit({ limit });\n}\n\nlet contextIdCounter = 0;\nconst contextIdRandom = () =>\n process.env.NODE_ENV === 'test' ? 0 : Math.floor(Math.random() * 100000);\n\nconst modelInfoSkip = [\n // Large fields\n 'tokenizer.ggml.tokens',\n 'tokenizer.ggml.token_type',\n 'tokenizer.ggml.merges',\n 'tokenizer.ggml.scores',\n];\n\nexport async function loadLlamaModelInfo(model: string): Promise<Object> {\n let path = model;\n if (path.startsWith('file://')) path = path.slice(7);\n return LlamaCpp.modelInfo({ path, skip: modelInfoSkip });\n}\n\nconst poolTypeMap = {\n // -1 is unspecified as undefined\n none: 0,\n mean: 1,\n cls: 2,\n last: 3,\n rank: 4,\n};\n\nexport async function initLlama(\n {\n model,\n is_model_asset: isModelAsset,\n pooling_type: poolingType,\n lora,\n lora_list: loraList,\n ...rest\n }: ContextParams,\n onProgress?: (progress: number) => void,\n): Promise<LlamaContext> {\n let path = model;\n if (path.startsWith('file://')) path = path.slice(7);\n\n let loraPath = lora;\n if (loraPath?.startsWith('file://')) loraPath = loraPath.slice(7);\n\n let loraAdapters: Array<{ path: string; scaled?: number }> = [];\n if (loraList)\n loraAdapters = loraList.map((l) => ({\n path: l.path.replace(/file:\\/\\//, ''),\n scaled: l.scaled,\n }));\n\n const contextId = contextIdCounter + contextIdRandom();\n contextIdCounter += 1;\n\n let removeProgressListener: any = null;\n if (onProgress) {\n removeProgressListener = LlamaCpp.addListener(\n EVENT_ON_INIT_CONTEXT_PROGRESS,\n (evt: { contextId: number; progress: number }) => {\n if (evt.contextId !== contextId) return;\n onProgress(evt.progress);\n },\n );\n }\n\n const poolType = poolTypeMap[poolingType as keyof typeof poolTypeMap];\n\n if (rest.cache_type_k && !validCacheTypes.includes(rest.cache_type_k)) {\n console.warn(`[LlamaCpp] initLlama: Invalid cache K type: ${rest.cache_type_k}, falling back to f16`);\n delete rest.cache_type_k;\n }\n if (rest.cache_type_v && !validCacheTypes.includes(rest.cache_type_v)) {\n console.warn(`[LlamaCpp] initLlama: Invalid cache V type: ${rest.cache_type_v}, falling back to f16`);\n delete rest.cache_type_v;\n }\n\n const {\n gpu,\n reasonNoGPU,\n model: modelDetails,\n androidLib,\n } = await LlamaCpp.initContext({\n contextId,\n params: {\n model: path,\n is_model_asset: !!isModelAsset,\n use_progress_callback: !!onProgress,\n pooling_type: poolType,\n lora: loraPath,\n lora_list: loraAdapters,\n ...rest,\n },\n }).catch((err: any) => {\n removeProgressListener?.remove();\n throw err;\n });\n removeProgressListener?.remove();\n return new LlamaContext({\n contextId,\n gpu,\n reasonNoGPU,\n model: modelDetails,\n androidLib,\n });\n}\n\nexport async function releaseAllLlama(): Promise<void> {\n return LlamaCpp.releaseAllContexts();\n}\n\nexport const BuildInfo = {\n number: '1.0.0',\n commit: 'capacitor-llama-cpp',\n};\n\n// Re-export the plugin for direct access\nexport { LlamaCpp };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerPlugin } from '@capacitor/core';\r\nimport type {\r\n NativeContextParams,\r\n NativeLlamaContext,\r\n NativeCompletionParams,\r\n NativeCompletionTokenProb,\r\n NativeCompletionResult,\r\n NativeTokenizeResult,\r\n NativeEmbeddingResult,\r\n NativeSessionLoadResult,\r\n NativeEmbeddingParams,\r\n NativeRerankParams,\r\n NativeRerankResult,\r\n NativeCompletionTokenProbItem,\r\n NativeCompletionResultTimings,\r\n JinjaFormattedChatResult,\r\n FormattedChatResult,\r\n NativeImageProcessingResult,\r\n NativeLlamaChatMessage,\r\n LlamaCppMessagePart,\r\n LlamaCppOAICompatibleMessage,\r\n ContextParams,\r\n EmbeddingParams,\r\n RerankParams,\r\n RerankResult,\r\n CompletionResponseFormat,\r\n CompletionParams,\r\n BenchResult,\r\n LlamaCppPlugin,\r\n} from './definitions';\r\n\r\n// Constants\r\nexport const LLAMACPP_MTMD_DEFAULT_MEDIA_MARKER = '<__media__>';\r\n\r\n// Event names\r\nconst EVENT_ON_INIT_CONTEXT_PROGRESS = '@LlamaCpp_onInitContextProgress';\r\nconst EVENT_ON_TOKEN = '@LlamaCpp_onToken';\r\nconst EVENT_ON_NATIVE_LOG = '@LlamaCpp_onNativeLog';\r\n\r\n// Register the plugin\r\nconst LlamaCpp = registerPlugin<LlamaCppPlugin>('LlamaCpp');\r\n\r\n// Log listeners management\r\nconst logListeners: Array<(level: string, text: string) => void> = [];\r\n\r\n// Set up native log listener\r\nLlamaCpp.addListener(EVENT_ON_NATIVE_LOG, (evt: { level: string; text: string }) => {\r\n logListeners.forEach((listener) => listener(evt.level, evt.text));\r\n});\r\n\r\n// Trigger unset to use default log callback\r\nLlamaCpp?.toggleNativeLog?.({ enabled: false })?.catch?.(() => {});\r\n\r\n// High-level types for the plugin interface\r\nexport type RNLlamaMessagePart = LlamaCppMessagePart;\r\nexport type RNLlamaOAICompatibleMessage = LlamaCppOAICompatibleMessage;\r\n\r\n// Re-export all types from definitions\r\nexport type {\r\n NativeContextParams,\r\n NativeLlamaContext,\r\n NativeCompletionParams,\r\n NativeCompletionTokenProb,\r\n NativeCompletionResult,\r\n NativeTokenizeResult,\r\n NativeEmbeddingResult,\r\n NativeSessionLoadResult,\r\n NativeEmbeddingParams,\r\n NativeRerankParams,\r\n NativeRerankResult,\r\n NativeCompletionTokenProbItem,\r\n NativeCompletionResultTimings,\r\n FormattedChatResult,\r\n JinjaFormattedChatResult,\r\n NativeImageProcessingResult,\r\n ContextParams,\r\n EmbeddingParams,\r\n RerankParams,\r\n RerankResult,\r\n CompletionResponseFormat,\r\n CompletionParams,\r\n BenchResult,\r\n};\r\n\r\nexport const RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER = LLAMACPP_MTMD_DEFAULT_MEDIA_MARKER;\r\n\r\nexport type ToolCall = {\r\n type: 'function';\r\n id?: string;\r\n function: {\r\n name: string;\r\n arguments: string; // JSON string\r\n };\r\n};\r\n\r\nexport type TokenData = {\r\n token: string;\r\n completion_probabilities?: Array<NativeCompletionTokenProb>;\r\n // Parsed content from accumulated text\r\n content?: string;\r\n reasoning_content?: string;\r\n tool_calls?: Array<ToolCall>;\r\n accumulated_text?: string;\r\n};\r\n\r\ntype TokenNativeEvent = {\r\n contextId: number;\r\n tokenResult: TokenData;\r\n};\r\n\r\nconst validCacheTypes = [\r\n 'f16',\r\n 'f32',\r\n 'bf16',\r\n 'q8_0',\r\n 'q4_0',\r\n 'q4_1',\r\n 'iq4_nl',\r\n 'q5_0',\r\n 'q5_1',\r\n];\r\n\r\nconst getJsonSchema = (responseFormat?: CompletionResponseFormat) => {\r\n if (responseFormat?.type === 'json_schema') {\r\n return responseFormat.json_schema?.schema;\r\n }\r\n if (responseFormat?.type === 'json_object') {\r\n return responseFormat.schema || {};\r\n }\r\n return null;\r\n};\r\n\r\n// Utility function to convert JSON schema to GBNF grammar\r\nconst jsonSchemaToGrammar = async (schema: object): Promise<string> => {\r\n // This will call the native method to convert JSON schema to GBNF\r\n // For now, we'll return a basic implementation\r\n try {\r\n const result = await LlamaCpp.convertJsonSchemaToGrammar({ schema: JSON.stringify(schema) });\r\n return result;\r\n } catch (error) {\r\n console.warn('Failed to convert JSON schema to GBNF, using fallback:', error);\r\n // Fallback for basic object structure\r\n return `root ::= \"{\" ws object_content ws \"}\"\r\nobject_content ::= string_field (\",\" ws string_field)*\r\nstring_field ::= \"\\\\\"\" [a-zA-Z_][a-zA-Z0-9_]* \"\\\\\"\" ws \":\" ws value\r\nvalue ::= string | number | boolean | \"null\"\r\nstring ::= \"\\\\\"\" [^\"]* \"\\\\\"\"\r\nnumber ::= \"-\"? [0-9]+ (\".\" [0-9]+)?\r\nboolean ::= \"true\" | \"false\"\r\nws ::= [ \\\\t\\\\n]*`;\r\n }\r\n};\r\n\r\nexport class LlamaContext {\r\n id: number;\r\n gpu: boolean = false;\r\n reasonNoGPU: string = '';\r\n model: NativeLlamaContext['model'];\r\n\r\n constructor({ contextId, gpu, reasonNoGPU, model }: NativeLlamaContext) {\r\n this.id = contextId;\r\n this.gpu = gpu;\r\n this.reasonNoGPU = reasonNoGPU;\r\n this.model = model;\r\n }\r\n\r\n /**\r\n * Load cached prompt & completion state from a file.\r\n */\r\n async loadSession(filepath: string): Promise<NativeSessionLoadResult> {\r\n let path = filepath;\r\n if (path.startsWith('file://')) path = path.slice(7);\r\n return LlamaCpp.loadSession({ contextId: this.id, filepath: path });\r\n }\r\n\r\n /**\r\n * Save current cached prompt & completion state to a file.\r\n */\r\n async saveSession(\r\n filepath: string,\r\n options?: { tokenSize: number },\r\n ): Promise<number> {\r\n return LlamaCpp.saveSession({ \r\n contextId: this.id, \r\n filepath, \r\n size: options?.tokenSize || -1 \r\n });\r\n }\r\n\r\n isLlamaChatSupported(): boolean {\r\n return !!this.model.chatTemplates.llamaChat;\r\n }\r\n\r\n isJinjaSupported(): boolean {\r\n const { minja } = this.model.chatTemplates;\r\n return !!minja?.toolUse || !!minja?.default;\r\n }\r\n\r\n async getFormattedChat(\r\n messages: RNLlamaOAICompatibleMessage[],\r\n template?: string | null,\r\n params?: {\r\n jinja?: boolean;\r\n response_format?: CompletionResponseFormat;\r\n tools?: object;\r\n parallel_tool_calls?: object;\r\n tool_choice?: string;\r\n enable_thinking?: boolean;\r\n add_generation_prompt?: boolean;\r\n now?: string | number;\r\n chat_template_kwargs?: Record<string, string>;\r\n },\r\n ): Promise<FormattedChatResult | JinjaFormattedChatResult> {\r\n const mediaPaths: string[] = [];\r\n const chat = messages.map((msg) => {\r\n if (Array.isArray(msg.content)) {\r\n const content = msg.content.map((part) => {\r\n // Handle multimodal content\r\n if (part.type === 'image_url') {\r\n let path = part.image_url?.url || '';\r\n if (path?.startsWith('file://')) path = path.slice(7);\r\n mediaPaths.push(path);\r\n return {\r\n type: 'text',\r\n text: RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER,\r\n };\r\n } else if (part.type === 'input_audio') {\r\n const { input_audio: audio } = part;\r\n if (!audio) throw new Error('input_audio is required');\r\n\r\n const { format } = audio;\r\n if (format != 'wav' && format != 'mp3') {\r\n throw new Error(`Unsupported audio format: ${format}`);\r\n }\r\n if (audio.url) {\r\n const path = audio.url.replace(/file:\\/\\//, '');\r\n mediaPaths.push(path);\r\n } else if (audio.data) {\r\n mediaPaths.push(audio.data);\r\n }\r\n return {\r\n type: 'text',\r\n text: RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER,\r\n };\r\n }\r\n return part;\r\n });\r\n\r\n return {\r\n ...msg,\r\n content,\r\n };\r\n }\r\n return msg;\r\n }) as NativeLlamaChatMessage[];\r\n\r\n const useJinja = this.isJinjaSupported() && params?.jinja;\r\n let tmpl;\r\n if (template) tmpl = template; // Force replace if provided\r\n const jsonSchema = getJsonSchema(params?.response_format);\r\n\r\n const result = await LlamaCpp.getFormattedChat({\r\n contextId: this.id,\r\n messages: JSON.stringify(chat),\r\n chatTemplate: tmpl,\r\n params: {\r\n jinja: useJinja,\r\n json_schema: jsonSchema ? JSON.stringify(jsonSchema) : undefined,\r\n tools: params?.tools ? JSON.stringify(params.tools) : undefined,\r\n parallel_tool_calls: params?.parallel_tool_calls\r\n ? JSON.stringify(params.parallel_tool_calls)\r\n : undefined,\r\n tool_choice: params?.tool_choice,\r\n enable_thinking: params?.enable_thinking ?? true,\r\n add_generation_prompt: params?.add_generation_prompt,\r\n now: typeof params?.now === 'number' ? params.now.toString() : params?.now,\r\n chat_template_kwargs: params?.chat_template_kwargs ? JSON.stringify(\r\n Object.entries(params.chat_template_kwargs).reduce((acc, [key, value]) => {\r\n acc[key] = JSON.stringify(value); // Each value is a stringified JSON object\r\n return acc;\r\n }, {} as Record<string, any>)\r\n ) : undefined,\r\n },\r\n });\r\n\r\n if (!useJinja) {\r\n return {\r\n type: 'llama-chat',\r\n prompt: result as string,\r\n has_media: mediaPaths.length > 0,\r\n media_paths: mediaPaths,\r\n };\r\n }\r\n const jinjaResult = result as JinjaFormattedChatResult;\r\n jinjaResult.type = 'jinja';\r\n jinjaResult.has_media = mediaPaths.length > 0;\r\n jinjaResult.media_paths = mediaPaths;\r\n return jinjaResult;\r\n }\r\n\r\n /**\r\n * Generate a completion based on the provided parameters\r\n * @param params Completion parameters including prompt or messages\r\n * @param callback Optional callback for token-by-token streaming\r\n * @returns Promise resolving to the completion result\r\n *\r\n * Note: For multimodal support, you can include an media_paths parameter.\r\n * This will process the images and add them to the context before generating text.\r\n * Multimodal support must be enabled via initMultimodal() first.\r\n */\r\n async completion(\r\n params: CompletionParams,\r\n callback?: (data: TokenData) => void,\r\n ): Promise<NativeCompletionResult> {\r\n const nativeParams = {\r\n ...params,\r\n prompt: params.prompt || '',\r\n emit_partial_completion: !!callback,\r\n };\r\n\r\n if (params.messages) {\r\n const formattedResult = await this.getFormattedChat(\r\n params.messages,\r\n params.chat_template || params.chatTemplate,\r\n {\r\n jinja: params.jinja,\r\n tools: params.tools,\r\n parallel_tool_calls: params.parallel_tool_calls,\r\n tool_choice: params.tool_choice,\r\n enable_thinking: params.enable_thinking,\r\n add_generation_prompt: params.add_generation_prompt,\r\n now: params.now,\r\n chat_template_kwargs: params.chat_template_kwargs,\r\n },\r\n );\r\n if (formattedResult.type === 'jinja') {\r\n const jinjaResult = formattedResult as JinjaFormattedChatResult;\r\n\r\n nativeParams.prompt = jinjaResult.prompt || '';\r\n if (typeof jinjaResult.chat_format === 'number')\r\n nativeParams.chat_format = jinjaResult.chat_format;\r\n if (jinjaResult.grammar) nativeParams.grammar = jinjaResult.grammar;\r\n if (typeof jinjaResult.grammar_lazy === 'boolean')\r\n nativeParams.grammar_lazy = jinjaResult.grammar_lazy;\r\n if (jinjaResult.grammar_triggers)\r\n nativeParams.grammar_triggers = jinjaResult.grammar_triggers;\r\n if (jinjaResult.preserved_tokens)\r\n nativeParams.preserved_tokens = jinjaResult.preserved_tokens;\r\n if (jinjaResult.additional_stops) {\r\n if (!nativeParams.stop) nativeParams.stop = [];\r\n nativeParams.stop.push(...jinjaResult.additional_stops);\r\n }\r\n if (jinjaResult.has_media) {\r\n nativeParams.media_paths = jinjaResult.media_paths;\r\n }\r\n } else if (formattedResult.type === 'llama-chat') {\r\n const llamaChatResult = formattedResult as FormattedChatResult;\r\n nativeParams.prompt = llamaChatResult.prompt || '';\r\n if (llamaChatResult.has_media) {\r\n nativeParams.media_paths = llamaChatResult.media_paths;\r\n }\r\n }\r\n } else {\r\n nativeParams.prompt = params.prompt || '';\r\n }\r\n\r\n // If media_paths were explicitly provided or extracted from messages, use them\r\n if (!nativeParams.media_paths && params.media_paths) {\r\n nativeParams.media_paths = params.media_paths;\r\n }\r\n\r\n // Handle structured output and grammar\r\n if (params.grammar) {\r\n // Direct GBNF grammar takes precedence\r\n nativeParams.grammar = params.grammar;\r\n } else if (nativeParams.response_format && !nativeParams.grammar) {\r\n const jsonSchema = getJsonSchema(params.response_format);\r\n if (jsonSchema) {\r\n // Try to convert JSON schema to GBNF grammar\r\n try {\r\n nativeParams.grammar = await jsonSchemaToGrammar(jsonSchema);\r\n } catch (error) {\r\n console.warn('Failed to convert JSON schema to grammar, falling back to json_schema parameter:', error);\r\n nativeParams.json_schema = JSON.stringify(jsonSchema);\r\n }\r\n }\r\n }\r\n\r\n let tokenListener: any =\r\n callback &&\r\n LlamaCpp.addListener(EVENT_ON_TOKEN, (evt: TokenNativeEvent) => {\r\n const { contextId, tokenResult } = evt;\r\n if (contextId !== this.id) return;\r\n callback(tokenResult);\r\n });\r\n\r\n if (!nativeParams.prompt) throw new Error('Prompt is required');\r\n\r\n const promise = LlamaCpp.completion({ contextId: this.id, params: nativeParams });\r\n return promise\r\n .then((completionResult) => {\r\n tokenListener?.remove();\r\n tokenListener = null;\r\n return completionResult;\r\n })\r\n .catch((err: any) => {\r\n tokenListener?.remove();\r\n tokenListener = null;\r\n throw err;\r\n });\r\n }\r\n\r\n stopCompletion(): Promise<void> {\r\n return LlamaCpp.stopCompletion({ contextId: this.id });\r\n }\r\n\r\n /**\r\n * Tokenize text or text with images\r\n * @param text Text to tokenize\r\n * @param params.media_paths Array of image paths to tokenize (if multimodal is enabled)\r\n * @returns Promise resolving to the tokenize result\r\n */\r\n tokenize(\r\n text: string,\r\n {\r\n media_paths: mediaPaths,\r\n }: {\r\n media_paths?: string[];\r\n } = {},\r\n ): Promise<NativeTokenizeResult> {\r\n return LlamaCpp.tokenize({ contextId: this.id, text, imagePaths: mediaPaths });\r\n }\r\n\r\n detokenize(tokens: number[]): Promise<string> {\r\n return LlamaCpp.detokenize({ contextId: this.id, tokens });\r\n }\r\n\r\n embedding(\r\n text: string,\r\n params?: EmbeddingParams,\r\n ): Promise<NativeEmbeddingResult> {\r\n return LlamaCpp.embedding({ contextId: this.id, text, params: params || {} });\r\n }\r\n\r\n /**\r\n * Rerank documents based on relevance to a query\r\n * @param query The query text to rank documents against\r\n * @param documents Array of document texts to rank\r\n * @param params Optional reranking parameters\r\n * @returns Promise resolving to an array of ranking results with scores and indices\r\n */\r\n async rerank(\r\n query: string,\r\n documents: string[],\r\n params?: RerankParams,\r\n ): Promise<RerankResult[]> {\r\n const results = await LlamaCpp.rerank({ \r\n contextId: this.id, \r\n query, \r\n documents, \r\n params: params || {} \r\n });\r\n\r\n // Sort by score descending and add document text if requested\r\n return results\r\n .map((result) => ({\r\n ...result,\r\n document: documents[result.index],\r\n }))\r\n .sort((a, b) => b.score - a.score);\r\n }\r\n\r\n async bench(\r\n pp: number,\r\n tg: number,\r\n pl: number,\r\n nr: number,\r\n ): Promise<BenchResult> {\r\n const result = await LlamaCpp.bench({ contextId: this.id, pp, tg, pl, nr });\r\n const [modelDesc, modelSize, modelNParams, ppAvg, ppStd, tgAvg, tgStd] =\r\n JSON.parse(result);\r\n return {\r\n modelDesc,\r\n modelSize,\r\n modelNParams,\r\n ppAvg,\r\n ppStd,\r\n tgAvg,\r\n tgStd,\r\n };\r\n }\r\n\r\n async applyLoraAdapters(\r\n loraList: Array<{ path: string; scaled?: number }>,\r\n ): Promise<void> {\r\n let loraAdapters: Array<{ path: string; scaled?: number }> = [];\r\n if (loraList)\r\n loraAdapters = loraList.map((l) => ({\r\n path: l.path.replace(/file:\\/\\//, ''),\r\n scaled: l.scaled,\r\n }));\r\n return LlamaCpp.applyLoraAdapters({ contextId: this.id, loraAdapters });\r\n }\r\n\r\n async removeLoraAdapters(): Promise<void> {\r\n return LlamaCpp.removeLoraAdapters({ contextId: this.id });\r\n }\r\n\r\n async getLoadedLoraAdapters(): Promise<\r\n Array<{ path: string; scaled?: number }>\r\n > {\r\n return LlamaCpp.getLoadedLoraAdapters({ contextId: this.id });\r\n }\r\n\r\n /**\r\n * Initialize multimodal support with a mmproj file\r\n * @param params Parameters for multimodal support\r\n * @param params.path Path to the multimodal projector file\r\n * @param params.use_gpu Whether to use GPU\r\n * @returns Promise resolving to true if initialization was successful\r\n */\r\n async initMultimodal({\r\n path,\r\n use_gpu: useGpu,\r\n }: {\r\n path: string;\r\n use_gpu?: boolean;\r\n }): Promise<boolean> {\r\n if (path.startsWith('file://')) path = path.slice(7);\r\n return LlamaCpp.initMultimodal({\r\n contextId: this.id,\r\n params: {\r\n path,\r\n use_gpu: useGpu ?? true,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Check if multimodal support is enabled\r\n * @returns Promise resolving to true if multimodal is enabled\r\n */\r\n async isMultimodalEnabled(): Promise<boolean> {\r\n return await LlamaCpp.isMultimodalEnabled({ contextId: this.id });\r\n }\r\n\r\n /**\r\n * Check multimodal support\r\n * @returns Promise resolving to an object with vision and audio support\r\n */\r\n async getMultimodalSupport(): Promise<{\r\n vision: boolean;\r\n audio: boolean;\r\n }> {\r\n return await LlamaCpp.getMultimodalSupport({ contextId: this.id });\r\n }\r\n\r\n /**\r\n * Release multimodal support\r\n * @returns Promise resolving to void\r\n */\r\n async releaseMultimodal(): Promise<void> {\r\n return await LlamaCpp.releaseMultimodal({ contextId: this.id });\r\n }\r\n\r\n /**\r\n * Initialize TTS support with a vocoder model\r\n * @param params Parameters for TTS support\r\n * @param params.path Path to the vocoder model\r\n * @param params.n_batch Batch size for the vocoder model\r\n * @returns Promise resolving to true if initialization was successful\r\n */\r\n async initVocoder({ path, n_batch: nBatch }: { path: string; n_batch?: number }): Promise<boolean> {\r\n if (path.startsWith('file://')) path = path.slice(7);\r\n return await LlamaCpp.initVocoder({ \r\n contextId: this.id, \r\n params: { path, n_batch: nBatch } \r\n });\r\n }\r\n\r\n /**\r\n * Check if TTS support is enabled\r\n * @returns Promise resolving to true if TTS is enabled\r\n */\r\n async isVocoderEnabled(): Promise<boolean> {\r\n return await LlamaCpp.isVocoderEnabled({ contextId: this.id });\r\n }\r\n\r\n /**\r\n * Get a formatted audio completion prompt\r\n * @param speakerJsonStr JSON string representing the speaker\r\n * @param textToSpeak Text to speak\r\n * @returns Promise resolving to the formatted audio completion result with prompt and grammar\r\n */\r\n async getFormattedAudioCompletion(\r\n speaker: object | null,\r\n textToSpeak: string,\r\n ): Promise<{\r\n prompt: string;\r\n grammar?: string;\r\n }> {\r\n return await LlamaCpp.getFormattedAudioCompletion({\r\n contextId: this.id,\r\n speakerJsonStr: speaker ? JSON.stringify(speaker) : '',\r\n textToSpeak,\r\n });\r\n }\r\n\r\n /**\r\n * Get guide tokens for audio completion\r\n * @param textToSpeak Text to speak\r\n * @returns Promise resolving to the guide tokens\r\n */\r\n async getAudioCompletionGuideTokens(\r\n textToSpeak: string,\r\n ): Promise<Array<number>> {\r\n return await LlamaCpp.getAudioCompletionGuideTokens({ contextId: this.id, textToSpeak });\r\n }\r\n\r\n /**\r\n * Decode audio tokens\r\n * @param tokens Array of audio tokens\r\n * @returns Promise resolving to the decoded audio tokens\r\n */\r\n async decodeAudioTokens(tokens: number[]): Promise<Array<number>> {\r\n return await LlamaCpp.decodeAudioTokens({ contextId: this.id, tokens });\r\n }\r\n\r\n /**\r\n * Release TTS support\r\n * @returns Promise resolving to void\r\n */\r\n async releaseVocoder(): Promise<void> {\r\n return await LlamaCpp.releaseVocoder({ contextId: this.id });\r\n }\r\n\r\n async release(): Promise<void> {\r\n return LlamaCpp.releaseContext({ contextId: this.id });\r\n }\r\n}\r\n\r\nexport async function toggleNativeLog(enabled: boolean): Promise<void> {\r\n return LlamaCpp.toggleNativeLog({ enabled });\r\n}\r\n\r\nexport function addNativeLogListener(\r\n listener: (level: string, text: string) => void,\r\n): { remove: () => void } {\r\n logListeners.push(listener);\r\n return {\r\n remove: () => {\r\n logListeners.splice(logListeners.indexOf(listener), 1);\r\n },\r\n };\r\n}\r\n\r\nexport async function setContextLimit(limit: number): Promise<void> {\r\n return LlamaCpp.setContextLimit({ limit });\r\n}\r\n\r\nlet contextIdCounter = 0;\r\nconst contextIdRandom = () =>\r\n process.env.NODE_ENV === 'test' ? 0 : Math.floor(Math.random() * 100000);\r\n\r\nconst modelInfoSkip = [\r\n // Large fields\r\n 'tokenizer.ggml.tokens',\r\n 'tokenizer.ggml.token_type',\r\n 'tokenizer.ggml.merges',\r\n 'tokenizer.ggml.scores',\r\n];\r\n\r\nexport async function loadLlamaModelInfo(model: string): Promise<Object> {\r\n let path = model;\r\n if (path.startsWith('file://')) path = path.slice(7);\r\n return LlamaCpp.modelInfo({ path, skip: modelInfoSkip });\r\n}\r\n\r\nconst poolTypeMap = {\r\n // -1 is unspecified as undefined\r\n none: 0,\r\n mean: 1,\r\n cls: 2,\r\n last: 3,\r\n rank: 4,\r\n};\r\n\r\nexport async function initLlama(\r\n {\r\n model,\r\n is_model_asset: isModelAsset,\r\n pooling_type: poolingType,\r\n lora,\r\n lora_list: loraList,\r\n ...rest\r\n }: ContextParams,\r\n onProgress?: (progress: number) => void,\r\n): Promise<LlamaContext> {\r\n let path = model;\r\n if (path.startsWith('file://')) path = path.slice(7);\r\n\r\n let loraPath = lora;\r\n if (loraPath?.startsWith('file://')) loraPath = loraPath.slice(7);\r\n\r\n let loraAdapters: Array<{ path: string; scaled?: number }> = [];\r\n if (loraList)\r\n loraAdapters = loraList.map((l) => ({\r\n path: l.path.replace(/file:\\/\\//, ''),\r\n scaled: l.scaled,\r\n }));\r\n\r\n const contextId = contextIdCounter + contextIdRandom();\r\n contextIdCounter += 1;\r\n\r\n let removeProgressListener: any = null;\r\n if (onProgress) {\r\n removeProgressListener = LlamaCpp.addListener(\r\n EVENT_ON_INIT_CONTEXT_PROGRESS,\r\n (evt: { contextId: number; progress: number }) => {\r\n if (evt.contextId !== contextId) return;\r\n onProgress(evt.progress);\r\n },\r\n );\r\n }\r\n\r\n const poolType = poolTypeMap[poolingType as keyof typeof poolTypeMap];\r\n\r\n if (rest.cache_type_k && !validCacheTypes.includes(rest.cache_type_k)) {\r\n console.warn(`[LlamaCpp] initLlama: Invalid cache K type: ${rest.cache_type_k}, falling back to f16`);\r\n delete rest.cache_type_k;\r\n }\r\n if (rest.cache_type_v && !validCacheTypes.includes(rest.cache_type_v)) {\r\n console.warn(`[LlamaCpp] initLlama: Invalid cache V type: ${rest.cache_type_v}, falling back to f16`);\r\n delete rest.cache_type_v;\r\n }\r\n\r\n // Log speculative decoding configuration if enabled\r\n if (rest.draft_model) {\r\n console.log(`🚀 Initializing with speculative decoding:\r\n - Main model: ${path}\r\n - Draft model: ${rest.draft_model}\r\n - Speculative samples: ${rest.speculative_samples || 3}\r\n - Mobile optimization: ${rest.mobile_speculative !== false ? 'enabled' : 'disabled'}`);\r\n }\r\n\r\n const {\r\n gpu,\r\n reasonNoGPU,\r\n model: modelDetails,\r\n androidLib,\r\n } = await LlamaCpp.initContext({\r\n contextId,\r\n params: {\r\n model: path,\r\n is_model_asset: !!isModelAsset,\r\n use_progress_callback: !!onProgress,\r\n pooling_type: poolType,\r\n lora: loraPath,\r\n lora_list: loraAdapters,\r\n ...rest,\r\n },\r\n }).catch((err: any) => {\r\n removeProgressListener?.remove();\r\n throw err;\r\n });\r\n removeProgressListener?.remove();\r\n return new LlamaContext({\r\n contextId,\r\n gpu,\r\n reasonNoGPU,\r\n model: modelDetails,\r\n androidLib,\r\n });\r\n}\r\n\r\nexport async function releaseAllLlama(): Promise<void> {\r\n return LlamaCpp.releaseAllContexts();\r\n}\r\n\r\n// Model download and management functions\r\nexport async function downloadModel(url: string, filename: string): Promise<string> {\r\n return LlamaCpp.downloadModel({ url, filename });\r\n}\r\n\r\nexport async function getDownloadProgress(url: string): Promise<{\r\n progress: number;\r\n completed: boolean;\r\n failed: boolean;\r\n errorMessage?: string;\r\n localPath?: string;\r\n downloadedBytes: number;\r\n totalBytes: number;\r\n}> {\r\n return LlamaCpp.getDownloadProgress({ url });\r\n}\r\n\r\nexport async function cancelDownload(url: string): Promise<boolean> {\r\n return LlamaCpp.cancelDownload({ url });\r\n}\r\n\r\nexport async function getAvailableModels(): Promise<Array<{\r\n name: string;\r\n path: string;\r\n size: number;\r\n}>> {\r\n return LlamaCpp.getAvailableModels();\r\n}\r\n\r\n/**\r\n * Convert a JSON schema to GBNF grammar format\r\n * @param schema JSON schema object\r\n * @returns Promise resolving to GBNF grammar string\r\n */\r\nexport async function convertJsonSchemaToGrammar(schema: object): Promise<string> {\r\n return jsonSchemaToGrammar(schema);\r\n}\r\n\r\nexport const BuildInfo = {\r\n number: '1.0.0',\r\n commit: 'capacitor-llama-cpp',\r\n};\r\n\r\n// Re-export the plugin for direct access\r\nexport { LlamaCpp };\r\n"]}
@@ -42,6 +42,27 @@ const getJsonSchema = (responseFormat) => {
42
42
  }
43
43
  return null;
44
44
  };
45
+ // Utility function to convert JSON schema to GBNF grammar
46
+ const jsonSchemaToGrammar = async (schema) => {
47
+ // This will call the native method to convert JSON schema to GBNF
48
+ // For now, we'll return a basic implementation
49
+ try {
50
+ const result = await LlamaCpp.convertJsonSchemaToGrammar({ schema: JSON.stringify(schema) });
51
+ return result;
52
+ }
53
+ catch (error) {
54
+ console.warn('Failed to convert JSON schema to GBNF, using fallback:', error);
55
+ // Fallback for basic object structure
56
+ return `root ::= "{" ws object_content ws "}"
57
+ object_content ::= string_field ("," ws string_field)*
58
+ string_field ::= "\\"" [a-zA-Z_][a-zA-Z0-9_]* "\\"" ws ":" ws value
59
+ value ::= string | number | boolean | "null"
60
+ string ::= "\\"" [^"]* "\\""
61
+ number ::= "-"? [0-9]+ ("." [0-9]+)?
62
+ boolean ::= "true" | "false"
63
+ ws ::= [ \\t\\n]*`;
64
+ }
65
+ };
45
66
  class LlamaContext {
46
67
  constructor({ contextId, gpu, reasonNoGPU, model }) {
47
68
  this.gpu = false;
@@ -220,10 +241,23 @@ class LlamaContext {
220
241
  if (!nativeParams.media_paths && params.media_paths) {
221
242
  nativeParams.media_paths = params.media_paths;
222
243
  }
223
- if (nativeParams.response_format && !nativeParams.grammar) {
244
+ // Handle structured output and grammar
245
+ if (params.grammar) {
246
+ // Direct GBNF grammar takes precedence
247
+ nativeParams.grammar = params.grammar;
248
+ }
249
+ else if (nativeParams.response_format && !nativeParams.grammar) {
224
250
  const jsonSchema = getJsonSchema(params.response_format);
225
- if (jsonSchema)
226
- nativeParams.json_schema = JSON.stringify(jsonSchema);
251
+ if (jsonSchema) {
252
+ // Try to convert JSON schema to GBNF grammar
253
+ try {
254
+ nativeParams.grammar = await jsonSchemaToGrammar(jsonSchema);
255
+ }
256
+ catch (error) {
257
+ console.warn('Failed to convert JSON schema to grammar, falling back to json_schema parameter:', error);
258
+ nativeParams.json_schema = JSON.stringify(jsonSchema);
259
+ }
260
+ }
227
261
  }
228
262
  let tokenListener = callback &&
229
263
  LlamaCpp.addListener(EVENT_ON_TOKEN, (evt) => {
@@ -483,6 +517,14 @@ async function initLlama(_a, onProgress) {
483
517
  console.warn(`[LlamaCpp] initLlama: Invalid cache V type: ${rest.cache_type_v}, falling back to f16`);
484
518
  delete rest.cache_type_v;
485
519
  }
520
+ // Log speculative decoding configuration if enabled
521
+ if (rest.draft_model) {
522
+ console.log(`🚀 Initializing with speculative decoding:
523
+ - Main model: ${path}
524
+ - Draft model: ${rest.draft_model}
525
+ - Speculative samples: ${rest.speculative_samples || 3}
526
+ - Mobile optimization: ${rest.mobile_speculative !== false ? 'enabled' : 'disabled'}`);
527
+ }
486
528
  const { gpu, reasonNoGPU, model: modelDetails, androidLib, } = await LlamaCpp.initContext({
487
529
  contextId,
488
530
  params: Object.assign({ model: path, is_model_asset: !!isModelAsset, use_progress_callback: !!onProgress, pooling_type: poolType, lora: loraPath, lora_list: loraAdapters }, rest),
@@ -502,6 +544,27 @@ async function initLlama(_a, onProgress) {
502
544
  async function releaseAllLlama() {
503
545
  return LlamaCpp.releaseAllContexts();
504
546
  }
547
+ // Model download and management functions
548
+ async function downloadModel(url, filename) {
549
+ return LlamaCpp.downloadModel({ url, filename });
550
+ }
551
+ async function getDownloadProgress(url) {
552
+ return LlamaCpp.getDownloadProgress({ url });
553
+ }
554
+ async function cancelDownload(url) {
555
+ return LlamaCpp.cancelDownload({ url });
556
+ }
557
+ async function getAvailableModels() {
558
+ return LlamaCpp.getAvailableModels();
559
+ }
560
+ /**
561
+ * Convert a JSON schema to GBNF grammar format
562
+ * @param schema JSON schema object
563
+ * @returns Promise resolving to GBNF grammar string
564
+ */
565
+ async function convertJsonSchemaToGrammar(schema) {
566
+ return jsonSchemaToGrammar(schema);
567
+ }
505
568
  const BuildInfo = {
506
569
  number: '1.0.0',
507
570
  commit: 'capacitor-llama-cpp',
@@ -513,6 +576,11 @@ exports.LlamaContext = LlamaContext;
513
576
  exports.LlamaCpp = LlamaCpp;
514
577
  exports.RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER = RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER;
515
578
  exports.addNativeLogListener = addNativeLogListener;
579
+ exports.cancelDownload = cancelDownload;
580
+ exports.convertJsonSchemaToGrammar = convertJsonSchemaToGrammar;
581
+ exports.downloadModel = downloadModel;
582
+ exports.getAvailableModels = getAvailableModels;
583
+ exports.getDownloadProgress = getDownloadProgress;
516
584
  exports.initLlama = initLlama;
517
585
  exports.loadLlamaModelInfo = loadLlamaModelInfo;
518
586
  exports.releaseAllLlama = releaseAllLlama;