v1.3.0: Full Rig integration - Multi-agent AI framework

This commit is contained in:
admin
2026-02-26 11:56:08 +04:00
Unverified
parent 04e0fcd59e
commit 5455eaa125
11 changed files with 1958 additions and 0 deletions

180
rig-service/src/tools.rs Normal file
View File

@@ -0,0 +1,180 @@
//! Tool registry and dynamic tool resolution
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
/// Tool definition
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tool {
pub name: String,
pub description: String,
pub parameters: serde_json::Value,
pub category: String,
}
/// Tool execution result
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolResult {
pub success: bool,
pub output: String,
pub error: Option<String>,
}
/// Tool registry for managing available tools
#[derive(Debug, Clone)]
pub struct ToolRegistry {
tools: Arc<RwLock<HashMap<String, Tool>>>,
}
impl ToolRegistry {
pub fn new() -> Self {
let mut registry = Self {
tools: Arc::new(RwLock::new(HashMap::new())),
};
// Register built-in tools
registry.register_builtin_tools();
registry
}
/// Register built-in tools
fn register_builtin_tools(&mut self) {
// Calculator tool
self.register_tool(Tool {
name: "calculator".to_string(),
description: "Perform mathematical calculations".to_string(),
parameters: serde_json::json!({
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Mathematical expression to evaluate"
}
},
"required": ["expression"]
}),
category: "utility".to_string(),
});
// Web search tool
self.register_tool(Tool {
name: "web_search".to_string(),
description: "Search the web for information".to_string(),
parameters: serde_json::json!({
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query"
},
"limit": {
"type": "integer",
"description": "Number of results"
}
},
"required": ["query"]
}),
category: "research".to_string(),
});
// File operations tool
self.register_tool(Tool {
name: "file_operations".to_string(),
description: "Read, write, and manage files".to_string(),
parameters: serde_json::json!({
"type": "object",
"properties": {
"operation": {
"type": "string",
"enum": ["read", "write", "delete", "list"]
},
"path": {
"type": "string",
"description": "File or directory path"
},
"content": {
"type": "string",
"description": "Content to write (for write operation)"
}
},
"required": ["operation", "path"]
}),
category: "filesystem".to_string(),
});
// Code execution tool
self.register_tool(Tool {
name: "code_execution".to_string(),
description: "Execute code snippets in various languages".to_string(),
parameters: serde_json::json!({
"type": "object",
"properties": {
"language": {
"type": "string",
"enum": ["python", "javascript", "rust", "bash"]
},
"code": {
"type": "string",
"description": "Code to execute"
}
},
"required": ["language", "code"]
}),
category: "development".to_string(),
});
}
/// Register a tool
pub async fn register_tool(&self, tool: Tool) {
let mut tools = self.tools.write().await;
tools.insert(tool.name.clone(), tool);
}
/// Get all tools
pub async fn get_all_tools(&self) -> Vec<Tool> {
let tools = self.tools.read().await;
tools.values().cloned().collect()
}
/// Get tools by category
pub async fn get_tools_by_category(&self, category: &str) -> Vec<Tool> {
let tools = self.tools.read().await;
tools.values()
.filter(|t| t.category == category)
.cloned()
.collect()
}
/// Search for tools by query (simple text search)
pub async fn search_tools(&self, query: &str, limit: usize) -> Vec<Tool> {
let tools = self.tools.read().await;
let query_lower = query.to_lowercase();
let mut results: Vec<_> = tools.values()
.filter(|t| {
t.name.to_lowercase().contains(&query_lower) ||
t.description.to_lowercase().contains(&query_lower)
})
.cloned()
.collect();
results.truncate(limit);
results
}
/// Get a specific tool by name
pub async fn get_tool(&self, name: &str) -> Option<Tool> {
let tools = self.tools.read().await;
tools.get(name).cloned()
}
}
impl Default for ToolRegistry {
fn default() -> Self {
Self::new()
}
}