Skip to content

Commit a40c8be

Browse files
committed
Upgrade rust tools on node startup.
1 parent a3b111e commit a40c8be

File tree

6 files changed

+72
-13
lines changed

6 files changed

+72
-13
lines changed

shinkai-bin/shinkai-node/src/llm_provider/execution/prompts/prompt_test.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ mod tests {
5252
ToolOutputArg::empty(),
5353
None,
5454
"local:::__official_shinkai:::concat_strings".to_string(),
55+
"1.0.0".to_string(),
5556
);
5657
let shinkai_tool = ShinkaiTool::Rust(tool, true);
5758

@@ -216,6 +217,7 @@ mod tests {
216217
ToolOutputArg::empty(),
217218
None,
218219
"local:::__official_shinkai:::concat_strings".to_string(),
220+
"1.0.0".to_string(),
219221
);
220222
let shinkai_tool = ShinkaiTool::Rust(tool, true);
221223

shinkai-bin/shinkai-node/src/managers/tool_router.rs

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ impl ToolRouter {
596596
println!("Adding {} Rust tools", rust_tools.len());
597597
let mut added_count = 0;
598598
let mut skipped_count = 0;
599+
let mut upgraded_count = 0;
599600

600601
for tool in rust_tools {
601602
let rust_tool = RustTool::new(
@@ -605,26 +606,66 @@ impl ToolRouter {
605606
tool.output_arg,
606607
None,
607608
tool.tool_router_key,
609+
tool.version,
608610
);
609611

610-
let _ = match self.sqlite_manager.get_tool_by_key(&rust_tool.tool_router_key) {
612+
let router_key = rust_tool.tool_router_key.clone();
613+
let new_version = IndexableVersion::from_string(&rust_tool.version).map_err(|e| {
614+
ToolError::ParseError(format!("Invalid Rust tool version '{}': {}", rust_tool.version, e))
615+
})?;
616+
617+
match self.sqlite_manager.get_tool_header_by_key(&router_key) {
611618
Err(SqliteManagerError::ToolNotFound(_)) => {
612619
added_count += 1;
613620
self.sqlite_manager
614621
.add_tool(ShinkaiTool::Rust(rust_tool, true))
615622
.await
616-
.map_err(|e| ToolError::DatabaseError(e.to_string()))
623+
.map_err(|e| ToolError::DatabaseError(e.to_string()))?;
617624
}
618-
Err(e) => Err(ToolError::DatabaseError(e.to_string())),
619-
Ok(_db_tool) => {
620-
skipped_count += 1;
621-
continue;
625+
Err(e) => return Err(ToolError::DatabaseError(e.to_string())),
626+
Ok(header) => {
627+
let current_version = IndexableVersion::from_string(&header.version).map_err(|e| {
628+
ToolError::ParseError(format!(
629+
"Invalid installed Rust tool version '{}': {}",
630+
header.version, e
631+
))
632+
})?;
633+
634+
if new_version > current_version {
635+
match self.sqlite_manager.get_tool_by_key(&router_key) {
636+
Ok(ShinkaiTool::Rust(existing_rust_tool, is_enabled)) => {
637+
let mut upgraded_tool = rust_tool.clone();
638+
if upgraded_tool.mcp_enabled.is_none() {
639+
upgraded_tool.mcp_enabled = existing_rust_tool.mcp_enabled;
640+
}
641+
642+
upgraded_count += 1;
643+
self.sqlite_manager
644+
.upgrade_tool(ShinkaiTool::Rust(upgraded_tool, is_enabled))
645+
.await
646+
.map_err(|e| ToolError::DatabaseError(e.to_string()))?;
647+
}
648+
Ok(other_variant) => {
649+
skipped_count += 1;
650+
eprintln!(
651+
"Expected Rust tool for key '{}' but found {:?}, skipping",
652+
router_key,
653+
other_variant.tool_type()
654+
);
655+
}
656+
Err(err) => {
657+
return Err(ToolError::DatabaseError(err.to_string()));
658+
}
659+
}
660+
} else {
661+
skipped_count += 1;
662+
}
622663
}
623-
}?;
664+
}
624665
}
625666
println!(
626-
"Rust tools installation complete - Added: {}, Skipped: {}",
627-
added_count, skipped_count
667+
"Rust tools installation complete - Added: {}, Upgraded: {}, Skipped: {}",
668+
added_count, upgraded_count, skipped_count
628669
);
629670
Ok(())
630671
}

shinkai-bin/shinkai-node/src/tools/tool_implementation/native_tools/sql_processor.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,16 @@ INSERT INTO table_name (field_1, field_3, field_4)
5858
5959
-- Example read:
6060
SELECT * FROM table_name WHERE field_2 > datetime('now', '-1 day');
61-
SELECT field_1, field_3 FROM table_name WHERE field_3 > 100 ORDER BY field_2 DESC LIMIT 10;"#
61+
SELECT field_1, field_3 FROM table_name WHERE field_3 > 100 ORDER BY field_2 DESC LIMIT 10;
62+
63+
-- Changelog:
64+
- 1.0.1: Fixed parameters to be compliant with JSON schema."#
6265
.to_string(),
6366
tool_router_key: "local:::__official_shinkai:::shinkai_sqlite_query_executor".to_string(),
6467
tool_type: "Rust".to_string(),
6568
formatted_tool_summary_for_ui: "Execute SQLite queries".to_string(),
6669
author: "@@official.shinkai".to_string(),
67-
version: "1.0".to_string(),
70+
version: "1.0.1".to_string(),
6871
enabled: true,
6972
mcp_enabled: Some(false),
7073
input_args: {
@@ -311,6 +314,7 @@ mod tests {
311314
mcp_enabled: sql_processor_tool.tool.mcp_enabled.clone(),
312315
input_args: sql_processor_tool.tool.input_args.clone(),
313316
output_arg: sql_processor_tool.tool.output_arg.clone(),
317+
version: sql_processor_tool.tool.version.clone(),
314318
tool_embedding: sql_processor_tool._tool_embedding.clone(),
315319
tool_router_key: sql_processor_tool.tool.tool_router_key.clone(),
316320
};

shinkai-libs/shinkai-sqlite/src/shinkai_tool_manager.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ impl SqliteManager {
295295
new_python.config = merged_config;
296296
(old_config, ShinkaiTool::Python(new_python, is_enabled))
297297
}
298+
(ShinkaiTool::Rust(_old_rust, _), ShinkaiTool::Rust(new_rust, is_enabled)) => {
299+
(Vec::new(), ShinkaiTool::Rust(new_rust, is_enabled))
300+
}
298301
_ => return Err(SqliteManagerError::ToolTypeMismatch),
299302
};
300303

shinkai-libs/shinkai-tools-primitives/src/tools/rust_tools.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,18 @@ impl fmt::Display for RustToolError {
2727

2828
impl std::error::Error for RustToolError {}
2929

30+
fn default_rust_tool_version() -> String {
31+
"1.0.0".to_string()
32+
}
33+
3034
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
3135
pub struct RustTool {
3236
pub name: String,
3337
pub description: String,
3438
pub input_args: Parameters,
3539
pub output_arg: ToolOutputArg,
40+
#[serde(default = "default_rust_tool_version")]
41+
pub version: String,
3642
pub tool_embedding: Option<Vec<f32>>,
3743
pub tool_router_key: String,
3844
pub mcp_enabled: Option<bool>,
@@ -46,12 +52,14 @@ impl RustTool {
4652
output_arg: ToolOutputArg,
4753
tool_embedding: Option<Vec<f32>>,
4854
tool_router_key: String,
55+
version: String,
4956
) -> Self {
5057
Self {
5158
name: utils::clean_string(&name),
5259
description,
5360
input_args,
5461
output_arg,
62+
version,
5563
tool_embedding,
5664
tool_router_key,
5765
mcp_enabled: Some(false),
@@ -79,6 +87,7 @@ impl RustTool {
7987
description: header.description.clone(),
8088
input_args: header.input_args.clone(),
8189
output_arg: header.output_arg.clone(),
90+
version: header.version.clone(),
8291
tool_embedding: None, // Assuming no embedding is provided in the header
8392
tool_router_key: header.tool_router_key.clone(),
8493
mcp_enabled: header.mcp_enabled,
@@ -106,7 +115,7 @@ impl RustTool {
106115

107116
ToolPlaygroundMetadata {
108117
name: self.name.clone(),
109-
version: "1.0.0".to_string(),
118+
version: self.version.clone(),
110119
homepage: None,
111120
description: self.description.clone(),
112121
author: self.author(),

shinkai-libs/shinkai-tools-primitives/src/tools/shinkai_tool.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ impl ShinkaiTool {
402402
/// Returns the version of the tool
403403
pub fn version(&self) -> String {
404404
match self {
405-
ShinkaiTool::Rust(_r, _) => "1.0.0".to_string(),
405+
ShinkaiTool::Rust(r, _) => r.version.clone(),
406406
ShinkaiTool::Network(n, _) => n.version.clone(),
407407
ShinkaiTool::Deno(d, _) => d.version.clone(),
408408
ShinkaiTool::Python(p, _) => p.version.clone(),

0 commit comments

Comments
 (0)