- Warning removal.
All checks were successful
GBCI / build (push) Successful in 15m18s

This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2025-07-19 12:10:16 -03:00
parent e17e0e36a0
commit 9a4bab6de6
8 changed files with 32 additions and 68 deletions

View file

@ -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)

View file

@ -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

View file

@ -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;

View file

@ -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"),
};

View file

@ -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(

View file

@ -0,0 +1 @@
pub mod find;

View file

@ -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."

View file

@ -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<Dynamic, Box<EvalAltResult>> {
self.engine.eval_ast(ast)
}
pub fn call_web_service(
&self,
endpoint: &str,
data: HashMap<String, String>,
) -> Result<String, Box<EvalAltResult>> {
Ok(format!("Called {} with {:?}", endpoint, data))
}
/// Execute a BASIC-style script without semicolons
pub fn execute_basic_script(&self, script: &str) -> Result<Dynamic, Box<EvalAltResult>> {
let processed = self.preprocess_basic_script(script);
let ast = self.engine.compile(&processed)?;
self.run(&ast)
}
}