v1.3.0: COMPLETE - Full Rig Integration with Production Setup

This commit is contained in:
admin
2026-02-26 12:04:51 +04:00
Unverified
parent 5455eaa125
commit f15ff46120
11 changed files with 544 additions and 27 deletions

22
rig-service/.env.example Normal file
View File

@@ -0,0 +1,22 @@
# QwenClaw Rig Service Configuration
# Server settings
RIG_HOST=127.0.0.1
RIG_PORT=8080
# Database path for vector store
RIG_DATABASE_PATH=./rig-store.db
# Model providers (get keys from respective platforms)
# OpenAI: https://platform.openai.com/api-keys
OPENAI_API_KEY=your-openai-api-key-here
# Anthropic: https://console.anthropic.com/settings/keys
ANTHROPIC_API_KEY=your-anthropic-api-key-here
# Qwen: (if using Qwen API)
# QWEN_API_KEY=your-qwen-api-key-here
# Defaults
RIG_DEFAULT_PROVIDER=openai
RIG_DEFAULT_MODEL=gpt-4o

View File

@@ -38,12 +38,9 @@ uuid = { version = "1", features = ["v4"] }
# Time
chrono = { version = "0.4", features = ["serde"] }
# Vector store (SQLite for simplicity)
# Vector store (SQLite - using single version)
rusqlite = { version = "0.31", features = ["bundled"] }
# Embeddings (using Rig's built-in)
rig-sqlite = "0.1"
[profile.release]
opt-level = 3
lto = true

View File

@@ -1,9 +1,8 @@
//! Agent management and multi-agent orchestration
use anyhow::Result;
use anyhow::{Result, Context};
use rig::{
agent::Agent,
client::{CompletionClient, ProviderClient},
completion::{Completion, Message},
providers::openai,
};
@@ -79,7 +78,7 @@ impl AgentManager {
sessions.iter().find(|s| s.id == id).cloned()
}
/// Execute agent prompt
/// Execute agent prompt using Rig
pub async fn execute_prompt(
&self,
session_id: &str,
@@ -89,18 +88,21 @@ impl AgentManager {
.await
.ok_or_else(|| anyhow::anyhow!("Session not found"))?;
// Create Rig client based on provider
let client = self.create_client(&session.config.provider)?;
// Get API key based on provider
let api_key = self.get_api_key(&session.config.provider)?;
// Create Rig agent with OpenAI provider
// Note: Rig uses unified provider interface
let client = openai::Client::new(&api_key);
// Build agent with Rig
let agent = client
.agent(&session.config.model)
.preamble(&session.config.preamble)
.temperature(session.config.temperature)
.build();
// Execute prompt
let response = agent.prompt(prompt).await?;
let response = agent.prompt(prompt).await
.map_err(|e| anyhow::anyhow!("Rig prompt execution failed: {}", e))?;
// Store message
let mut sessions = self.sessions.write().await;
@@ -167,31 +169,38 @@ impl AgentManager {
for agent in &council.agents {
match self.execute_prompt(&agent.id, task).await {
Ok(result) => {
results.push(format!("{}: {}", agent.config.name, result));
results.push(format!("**{}**: {}", agent.config.name, result));
}
Err(e) => {
results.push(format!("{}: Error - {}", agent.config.name, e));
results.push(format!("**{}**: Error - {}", agent.config.name, e));
}
}
}
// Synthesize results
Ok(results.join("\n\n"))
Ok(results.join("\n\n---\n\n"))
}
/// Create Rig client for provider
fn create_client(&self, provider: &str) -> Result<openai::Client> {
/// Get API key for provider
fn get_api_key(&self, provider: &str) -> Result<String> {
match provider.to_lowercase().as_str() {
"openai" => {
let api_key = std::env::var("OPENAI_API_KEY")
.map_err(|_| anyhow::anyhow!("OPENAI_API_KEY not set"))?;
Ok(openai::Client::new(&api_key))
std::env::var("OPENAI_API_KEY")
.map_err(|_| anyhow::anyhow!("OPENAI_API_KEY not set"))
}
"anthropic" => {
std::env::var("ANTHROPIC_API_KEY")
.map_err(|_| anyhow::anyhow!("ANTHROPIC_API_KEY not set"))
}
"qwen" | "default" => {
// Fall back to OpenAI for now
std::env::var("OPENAI_API_KEY")
.or_else(|_| std::env::var("QWEN_API_KEY"))
.map_err(|_| anyhow::anyhow!("No API key found (tried OPENAI_API_KEY, QWEN_API_KEY)"))
}
_ => {
// Default to OpenAI for now
let api_key = std::env::var("OPENAI_API_KEY")
.unwrap_or_else(|_| "dummy".to_string());
Ok(openai::Client::new(&api_key))
std::env::var("OPENAI_API_KEY")
.map_err(|_| anyhow::anyhow!("Unknown provider '{}' and no OPENAI_API_KEY set", provider))
}
}
}