|
1
|
//! On-device LLM inference powered by [mistral.rs](https://github.com/EricLBuehler/mistral.rs). |
|
2
|
//! |
|
3
|
//! This module provides a high-level, framework-agnostic API for running |
|
4
|
//! LLM chat inference on-device across macOS, iOS, Windows, Linux, and Android. |
|
5
|
//! |
|
6
|
//! # Modules |
|
7
|
//! |
|
8
|
//! - [`engine`] — The main [`ChatEngine`](engine::ChatEngine) that wraps mistral.rs |
|
9
|
//! with conversation history, sampling config, and model lifecycle management. |
|
10
|
//! - [`types`] — Shared types ([`ChatMessage`](types::ChatMessage), |
|
11
|
//! [`SamplingConfig`](types::SamplingConfig), [`InferenceResult`](types::InferenceResult), etc.) |
|
12
|
//! used by the engine and any UI layer. |
|
13
|
//! - [`models`] — Model ID constants and rich metadata for all supported models. |
|
14
|
//! - [`token`] — HuggingFace token resolution (build-time literal or on-disk cache). |
|
15
|
//! |
|
16
|
//! # Quick Start |
|
17
|
//! |
|
18
|
//! ```rust,ignore |
|
19
|
//! use onde::inference::engine::ChatEngine; |
|
20
|
//! use onde::inference::types::*; |
|
21
|
//! |
|
22
|
//! // Create engine and load the platform-appropriate default model. |
|
23
|
//! let engine = ChatEngine::new(); |
|
24
|
//! engine.load_gguf_model( |
|
25
|
//! GgufModelConfig::platform_default(), |
|
26
|
//! Some("You are a helpful assistant.".into()), |
|
27
|
//! None, // platform-aware sampling defaults |
|
28
|
//! ).await?; |
|
29
|
//! |
|
30
|
//! // Multi-turn chat (history is managed automatically). |
|
31
|
//! let reply = engine.send_message("What is Rust's ownership model?").await?; |
|
32
|
//! println!("{}", reply.text); |
|
33
|
//! |
|
34
|
//! let follow_up = engine.send_message("Can you give me an example?").await?; |
|
35
|
//! println!("{}", follow_up.text); |
|
36
|
//! |
|
37
|
//! // One-shot generation (does NOT modify conversation history). |
|
38
|
//! let enhanced = engine.generate( |
|
39
|
//! vec![ChatMessage::user("Expand this into a detailed prompt: a cat in space")], |
|
40
|
//! Some(SamplingConfig::deterministic()), |
|
41
|
//! ).await?; |
|
42
|
//! println!("{}", enhanced.text); |
|
43
|
//! |
|
44
|
//! // Streaming inference. |
|
45
|
//! let mut rx = engine.stream_message("Tell me a story.").await?; |
|
46
|
//! while let Some(chunk) = rx.recv().await { |
|
47
|
//! if !chunk.delta.is_empty() { |
|
48
|
//! print!("{}", chunk.delta); |
|
49
|
//! } |
|
50
|
//! if chunk.done { |
|
51
|
//! break; |
|
52
|
//! } |
|
53
|
//! } |
|
54
|
//! |
|
55
|
//! // Cleanup. |
|
56
|
//! engine.unload_model().await; |
|
57
|
//! ``` |
|
58
|
|
|
59
|
pub mod engine; |
|
60
|
pub mod ffi; |
|
61
|
pub mod models; |
|
62
|
pub mod token; |
|
63
|
pub mod types; |
|
64
|
|
|
65
|
// Re-export the most commonly used items at the `inference::` level for |
|
66
|
// ergonomic imports like `use onde::inference::{ChatEngine, ChatMessage, ...}`. |
|
67
|
pub use engine::ChatEngine; |
|
68
|
pub use ffi::{OndeChatEngine, StreamChunkListener}; |
|
69
|
pub use types::{ |
|
70
|
ChatMessage, |
|
71
|
ChatRole, |
|
72
|
// Tool calling |
|
73
|
ChatTurn, |
|
74
|
CompletionResult, |
|
75
|
EngineInfo, |
|
76
|
EngineStatus, |
|
77
|
GgufModelConfig, |
|
78
|
InferenceError, |
|
79
|
InferenceResult, |
|
80
|
IsqModelConfig, |
|
81
|
SamplingConfig, |
|
82
|
StreamChunk, |
|
83
|
ToolAwareResult, |
|
84
|
ToolCallInfo, |
|
85
|
ToolCallRequest, |
|
86
|
ToolCallingSupport, |
|
87
|
ToolDefinition, |
|
88
|
ToolResult, |
|
89
|
UqffModelConfig, |
|
90
|
}; |