From 9a4bab6de686e4fcd585a43607df3b38dffd5a9f Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Sat, 19 Jul 2025 12:10:16 -0300 Subject: [PATCH] - Warning removal. --- src/main.rs | 35 +++++++++--------------- src/prompts/business/data-enrichment.bas | 5 ++++ src/services.rs | 2 +- src/services/config.rs | 11 -------- src/services/{ => keywords}/find.rs | 2 -- src/services/keywords/mod.rs | 1 + src/services/llm.rs | 12 ++++---- src/services/script.rs | 32 ++++------------------ 8 files changed, 32 insertions(+), 68 deletions(-) create mode 100644 src/prompts/business/data-enrichment.bas rename src/services/{ => keywords}/find.rs (98%) create mode 100644 src/services/keywords/mod.rs diff --git a/src/main.rs b/src/main.rs index 9f32e61..9b63de3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,13 +3,12 @@ use actix_web::http::header; use actix_web::{web, App, HttpServer}; use dotenv::dotenv; -use services::script -::*; use services::config::*; use services::email::*; use services::file::*; -use services::state::*; use services::llm::*; +use services::script::*; +use services::state::*; use sqlx::PgPool; //use services:: find::*; mod services; @@ -35,37 +34,29 @@ async fn main() -> std::io::Result<()> { minio_client: minio_client.into(), }); - let script_service = ScriptService::new(&app_state.clone()); - - let script = r#" - let items = FIND "gb.rob", "ACTION=EMUL1" - FOR EACH item IN items - let text = GET "example.com" - PRINT item.name - NEXT item "#; - - match script_service.compile(script) { - Ok(ast) => { - match script_service.run(&ast) { - Ok(result) => println!("Script executed successfully: {:?}", result), - Err(e) => eprintln!("Error executing script: {}", e), - } + let script_service = ScriptService::new(&app_state.clone()); + + const TEXT : &str = include_str!("prompts/business/data-enrichment.bas"); + + match script_service.compile(TEXT) { + Ok(ast) => match script_service.run(&ast) { + Ok(result) => println!("Script executed successfully: {:?}", result), + Err(e) => eprintln!("Error executing script: {}", e), }, Err(e) => eprintln!("Error compiling script: {}", e), } - - // Start HTTP server HttpServer::new(move || { let cors = Cors::default() - .allowed_origin("http://localhost:3000") // Your Next.js port + .send_wildcard() + .allowed_origin("*") .allowed_methods(vec!["GET", "POST", "PUT", "DELETE"]) .allowed_headers(vec![header::AUTHORIZATION, header::ACCEPT]) .allowed_header(header::CONTENT_TYPE) .max_age(3600); App::new() - //.wrap(cors) + .wrap(cors) .app_data(app_state.clone()) .service(upload_file) .service(list_file) diff --git a/src/prompts/business/data-enrichment.bas b/src/prompts/business/data-enrichment.bas new file mode 100644 index 0000000..27fd0b5 --- /dev/null +++ b/src/prompts/business/data-enrichment.bas @@ -0,0 +1,5 @@ +let items = FIND "gb.rob", "ACTION=EMUL1" +FOR EACH item IN items + let text = GET "example.com" + PRINT item.name +NEXT item \ No newline at end of file diff --git a/src/services.rs b/src/services.rs index c10bab9..8eb5178 100644 --- a/src/services.rs +++ b/src/services.rs @@ -2,7 +2,7 @@ pub mod config; pub mod state; pub mod email; -pub mod find; +pub mod keywords; pub mod file; pub mod llm; pub mod script; \ No newline at end of file diff --git a/src/services/config.rs b/src/services/config.rs index c4d48b9..e6c8b58 100644 --- a/src/services/config.rs +++ b/src/services/config.rs @@ -42,16 +42,12 @@ pub struct EmailConfig { pub port: u16, pub username: String, pub password: String, - pub reject_unauthorized: bool, } #[derive(Clone)] pub struct AIConfig { - pub image_model: String, - pub embedding_model: String, pub instance: String, pub key: String, - pub llm_model: String, pub version: String, pub endpoint: String, } @@ -124,18 +120,11 @@ impl AppConfig { .expect("EMAIL_PORT must be a number"), username: env::var("EMAIL_USER").expect("EMAIL_USER not set"), password: env::var("EMAIL_PASS").expect("EMAIL_PASS not set"), - reject_unauthorized: env::var("EMAIL_REJECT_UNAUTHORIZED") - .unwrap_or_else(|_| "false".to_string()) - .parse() - .unwrap_or(false), }; let ai = AIConfig { - image_model: env::var("AI_IMAGE_MODEL").expect("AI_IMAGE_MODEL not set"), - embedding_model: env::var("AI_EMBEDDING_MODEL").expect("AI_EMBEDDING_MODEL not set"), instance: env::var("AI_INSTANCE").expect("AI_INSTANCE not set"), key: env::var("AI_KEY").expect("AI_KEY not set"), - llm_model: env::var("AI_LLM_MODEL").expect("AI_LLM_MODEL not set"), version: env::var("AI_VERSION").expect("AI_VERSION not set"), endpoint: env::var("AI_ENDPOINT").expect("AI_ENDPOINT not set"), }; diff --git a/src/services/find.rs b/src/services/keywords/find.rs similarity index 98% rename from src/services/find.rs rename to src/services/keywords/find.rs index 988f0e0..53528c0 100644 --- a/src/services/find.rs +++ b/src/services/keywords/find.rs @@ -1,10 +1,8 @@ use serde_json::{json, Value}; -use sqlx::postgres::PgPoolOptions; use sqlx::Column; // Required for .name() method use sqlx::TypeInfo; // Required for .type_info() method use sqlx::{postgres::PgRow, PgPool, Row}; use std::error::Error; -use std::time::Duration; pub async fn execute_find( diff --git a/src/services/keywords/mod.rs b/src/services/keywords/mod.rs new file mode 100644 index 0000000..f4dab31 --- /dev/null +++ b/src/services/keywords/mod.rs @@ -0,0 +1 @@ +pub mod find; \ No newline at end of file diff --git a/src/services/llm.rs b/src/services/llm.rs index d9db179..b5212a0 100644 --- a/src/services/llm.rs +++ b/src/services/llm.rs @@ -16,7 +16,6 @@ use langchain_rust::{ template_fstring, }; - use crate::services::{config::AIConfig, state::AppState}; pub fn from_config(config: &AIConfig) -> AzureConfig { @@ -30,9 +29,8 @@ pub fn from_config(config: &AIConfig) -> AzureConfig { #[derive(serde::Deserialize)] struct ChatRequest { input: String, - context: String, - } + #[derive(serde::Serialize)] struct ChatResponse { text: String, @@ -58,11 +56,14 @@ pub async fn chat( // Parse the context JSON let context: serde_json::Value = match serde_json::from_str(&request) { Ok(ctx) => ctx, - Err(_) => serde_json::json!({}) + Err(_) => serde_json::json!({}), }; // Check view type and prepare appropriate prompt - let view_type = context.get("viewType").and_then(|v| v.as_str()).unwrap_or(""); + let view_type = context + .get("viewType") + .and_then(|v| v.as_str()) + .unwrap_or(""); let (prompt, might_trigger_action) = match view_type { "email" => ( format!( @@ -109,7 +110,6 @@ pub async fn chat_stream( let azure_config = from_config(&state.config.clone().unwrap().ai); let open_ai = OpenAI::new(azure_config); - let prompt = message_formatter![ fmt_message!(Message::new_system_message( "You are world class technical documentation writer." diff --git a/src/services/script.rs b/src/services/script.rs index 09002a2..ab77f68 100644 --- a/src/services/script.rs +++ b/src/services/script.rs @@ -1,17 +1,14 @@ -use anyhow::Error; -use rhai::module_resolvers::StaticModuleResolver; -use rhai::{Array, Dynamic, Engine, FnPtr, Scope}; -use rhai::{EvalAltResult, ImmutableString, LexError, ParseError, ParseErrorType, Position}; +use rhai::{Array, Dynamic, Engine}; +use rhai::{EvalAltResult}; use serde_json::{json, Value}; use smartstring::SmartString; -use std::collections::HashMap; -use crate::services::find::execute_find; +use crate::services::keywords::find::execute_find; use crate::services::state::AppState; pub struct ScriptService { engine: Engine, - module_resolver: StaticModuleResolver, + } fn json_value_to_dynamic(value: &Value) -> Dynamic { @@ -58,8 +55,7 @@ fn to_array(value: Dynamic) -> Array { impl ScriptService { pub fn new(state: &AppState) -> Self { let mut engine = Engine::new(); - let module_resolver = StaticModuleResolver::new(); - + // Configure engine for BASIC-like syntax engine.set_allow_anonymous_fn(true); engine.set_allow_looping(true); @@ -110,7 +106,7 @@ impl ScriptService { for item in array { // Push the loop variable into the scope - context.scope_mut().push(loop_var.clone(), item); + context.scope_mut().push(loop_var, item); // Evaluate the block with the current scope match context.eval_expression_tree(block) { @@ -299,7 +295,6 @@ impl ScriptService { ScriptService { engine, - module_resolver, } } @@ -403,19 +398,4 @@ impl ScriptService { pub fn run(&self, ast: &rhai::AST) -> Result> { self.engine.eval_ast(ast) } - - pub fn call_web_service( - &self, - endpoint: &str, - data: HashMap, - ) -> Result> { - Ok(format!("Called {} with {:?}", endpoint, data)) - } - - /// Execute a BASIC-style script without semicolons - pub fn execute_basic_script(&self, script: &str) -> Result> { - let processed = self.preprocess_basic_script(script); - let ast = self.engine.compile(&processed)?; - self.run(&ast) - } }