feat: add support for Router provider and enhance command handling

This commit is contained in:
asepharyana
2026-07-12 01:43:57 +07:00
parent a8fee71e06
commit 9f272d5973
5 changed files with 48 additions and 7 deletions
+15 -3
View File
@@ -48,6 +48,15 @@ impl LlmClient {
messages: &[ChatMessage],
tools: Option<Vec<ToolDef>>,
) -> Result<ChatMessage> {
let (msg, _usage) = self.chat_with_tools_non_streaming(messages, tools)?;
Ok(msg)
}
pub fn chat_with_tools_non_streaming(
&self,
messages: &[ChatMessage],
tools: Option<Vec<ToolDef>>,
) -> Result<(ChatMessage, Option<(u64, u64)>)> {
let req = ChatRequest {
model: self.model.clone(),
messages: messages.to_vec(),
@@ -75,7 +84,7 @@ impl LlmClient {
http_req = http_req.header("Authorization", format!("Bearer {}", self.api_key));
}
let result = (|| -> Result<ChatMessage> {
let result = (|| -> Result<(ChatMessage, Option<(u64, u64)>)> {
let resp = http_req.json(&req).send().map_err(|e| {
if e.is_timeout() {
anyhow::anyhow!("API request timed out after {:?}. Check your network or try again.", REQUEST_TIMEOUT)
@@ -93,17 +102,20 @@ impl LlmClient {
}
let data: crate::dto::provider::response::ChatResponse = resp.json()?;
let usage = data.usage.map(|u| {
(u.prompt_tokens.unwrap_or(0) as u64, u.completion_tokens.unwrap_or(0) as u64)
});
let message = data
.choices
.into_iter()
.next()
.map(|c| c.message)
.ok_or_else(|| anyhow::anyhow!("API response had no choices"))?;
Ok(message)
Ok((message, usage))
})();
match result {
Ok(msg) => return Ok(msg),
Ok((msg, usage)) => return Ok((msg, usage)),
Err(e) => {
if attempt >= max_retries {
return Err(e);