Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ serde_json = "1"
toml = "0.8"

# HTTP
reqwest = { version = "0.12", features = ["json", "multipart"] }
reqwest = { version = "0.12", features = ["json", "multipart", "stream"] }
axum = { version = "0.8", features = ["ws"] }
axum-extra = { version = "0.10", features = ["typed-header"] }
tower = "0.5"
Expand Down
5 changes: 5 additions & 0 deletions mofa-engine-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ serde = { workspace = true }
serde_json = { workspace = true }
toml = { workspace = true }
reqwest = { workspace = true }
tokio-stream = { workspace = true }
base64 = "0.22"
thiserror = { workspace = true }
anyhow = { workspace = true }
tracing = { workspace = true }
Expand All @@ -22,3 +24,6 @@ sysinfo = { workspace = true }
dashmap = { workspace = true }
dirs = { workspace = true }
tempfile = { workspace = true }

[dev-dependencies]
axum = { workspace = true }
2 changes: 2 additions & 0 deletions mofa-engine-core/src/backends.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
pub mod local_tts;
pub mod ollama;
pub mod openai_compat;
pub mod video_task;

pub use local_tts::LocalTtsProvider;
pub use ollama::OllamaProvider;
pub use openai_compat::OpenAiCompatProvider;
pub use video_task::VideoTaskProvider;
3 changes: 3 additions & 0 deletions mofa-engine-core/src/backends/local_tts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ impl LocalTtsProvider {
tokens_used: None,
fallback_used: false,
routing_reason: None,
reasoning: None,
files: Vec::new(),
})
}
}
Expand Down Expand Up @@ -337,6 +339,7 @@ mod tests {
messages: vec![Message {
role: "user".into(),
content: text.into(),
images: Vec::new(),
}],
input_file: None,
params: serde_json::Value::Null,
Expand Down
18 changes: 18 additions & 0 deletions mofa-engine-core/src/backends/ollama.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ struct OllamaChatRequest {
struct OllamaMessage {
role: String,
content: String,
/// Bare base64 image payloads (Ollama chat API format).
#[serde(default, skip_serializing_if = "Vec::is_empty")]
images: Vec<String>,
}

#[derive(Debug, Deserialize)]
Expand Down Expand Up @@ -211,10 +214,12 @@ impl Provider for OllamaProvider {
messages: vec![OllamaMessage {
role: "user".into(),
content: " ".into(),
images: Vec::new(),
}],
stream: false,
keep_alive: Some("5m".into()),
};
// (health probe: no images)
let url = format!("{}/api/chat", self.base_url);
let resp = self
.client
Expand Down Expand Up @@ -251,6 +256,7 @@ impl Provider for OllamaProvider {
messages: vec![OllamaMessage {
role: "user".into(),
content: " ".into(),
images: Vec::new(),
}],
stream: false,
keep_alive: Some("0".into()),
Expand Down Expand Up @@ -298,6 +304,16 @@ impl Provider for OllamaProvider {
.map(|m| OllamaMessage {
role: m.role.clone(),
content: m.content.clone(),
// Ollama wants bare base64; kernel messages carry data URLs.
images: m
.images
.iter()
.map(|url| {
url.split_once(",")
.map(|(_, payload)| payload.to_string())
.unwrap_or_else(|| url.clone())
})
.collect(),
})
.collect();

Expand Down Expand Up @@ -354,6 +370,8 @@ impl Provider for OllamaProvider {
tokens_used: chat_resp.eval_count,
fallback_used: false,
routing_reason: None,
reasoning: None,
files: Vec::new(),
})
}
}
Expand Down
Loading