1129 lines
43 KiB
MQL5
1129 lines
43 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| BaseTab.mqh |
|
|
//| Copyright 2025, Niquel Mendoza. |
|
|
//| https://www.mql5.com/es/users/nique_372 |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2025, Niquel Mendoza."
|
|
#property link "https://www.mql5.com/es/users/nique_372"
|
|
#property strict
|
|
|
|
#ifndef AIFULLTAB_SRC_TAB_BASETAB_MQH
|
|
#define AIFULLTAB_SRC_TAB_BASETAB_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
//---
|
|
#include "..\\Tlg\\TlgmSend.mqh"
|
|
|
|
//---
|
|
#define private public
|
|
#define protected public
|
|
// EAF (GUI Lib) y base tab
|
|
#include <TSN\\EAFModExt\\BaseTab.mqh>
|
|
#undef private
|
|
#undef protected
|
|
|
|
//---
|
|
#include <TSN\\EAFModExt\\Keys.mqh>
|
|
|
|
//---
|
|
#include <TSN\\LLM\\Main.mqh>
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#ifndef TABLLMAGENT_COLORS
|
|
|
|
#define TABLLMAGENT_COLOR_FONDO C'26,29,39'
|
|
#define TABLLMAGENT_COLOR_TEXT_PRIMARY C'220,220,220'
|
|
#define TABLLMAGENT_COLOR_TEXT_SECONDARY C'160,165,185'
|
|
#define TABLLMAGENT_COLOR_ACCENT C'105,168,243'
|
|
#define TABLLMAGENT_COLOR_BORDER C'58,63,82'
|
|
#define TABLLMAGENT_COLOR_BORDER_HOVER C'61,142,240'
|
|
#define TABLLMAGENT_COLOR_EDIT_BACK C'40,44,58'
|
|
#define TABLLMAGENT_COLOR_EDIT_BORDER C'58,63,82'
|
|
#define TABLLMAGENT_COLOR_EDIT_TEXT_NORMAL C'180,185,200'
|
|
#define TABLLMAGENT_COLOR_EDIT_TEXT_SELECTED C'61,142,240'
|
|
#define TABLLMAGENT_COLOR_EDIT_TEXT_HIGHLIGHT C'255,255,255'
|
|
#define TABLLMAGENT_COLOR_BTN_BACK C'45,50,65'
|
|
#define TABLLMAGENT_COLOR_BTN_BORDER C'58,63,82'
|
|
#define TABLLMAGENT_COLOR_LABEL_TITLE_BACK C'38,42,55'
|
|
#define TABLLMAGENT_COLOR_FONDO_SUBTAB C'37,40,54'
|
|
#define TABLLMAGENT_COLOR_FONDO_SUBTAB_HOVER C'61,142,240'
|
|
#define TABLLMAGENT_COLOR_FONDO_SUBTAB_PRESSED C'46,50,66'
|
|
#define TABLLMAGENT_COLOR_FONDO_SUBTAB_LOCKED C'37,40,54'
|
|
|
|
#endif // TABLLMAGENT_COLORS
|
|
|
|
|
|
|
|
#ifndef TABLLMAGENT_FOLDER_AI
|
|
#define TABLLMAGENT_FOLDER_AI "AiAgent\\"
|
|
#endif
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#define TABLLMAGENT_GAP_Y_FIRST (12)
|
|
#define TABLLMAGENT_GAP_Y_SEC (10)
|
|
#define TABLLMAGENT_GAP_Y_SECTION (25)
|
|
#define TABLLMAGENT_LABEL_X_PAD (5)
|
|
#define TABLLMAGENT_FONT ("Arial")
|
|
#define TABLLMAGENT_FONT_SIZE (10)
|
|
#define TABLLMAGENT_FONT_SIZE_TTL (14)
|
|
|
|
//---
|
|
string g_tab_llm_agent_base[];
|
|
|
|
//---
|
|
|
|
/*
|
|
m_btn_vis_apikey="Show and Hide value"
|
|
m_btn_vis_chat_id="Show and Hide value"
|
|
m_btn_vis_bot_token="Show and Hide value"
|
|
*/
|
|
|
|
//---
|
|
#define TABLLMAGENT_SUBTABS_TOTAL (2)
|
|
#define TABLLMAGENT_SUBTAB_TLGMAPI (0)
|
|
#define TABLLMAGENT_SUBTAB_MCP (1)
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CTabLlmAgentBase : public CGuiBaseComponent<CLoggerBase>
|
|
{
|
|
private:
|
|
//---
|
|
CTabs m_tabs;
|
|
TSN::CJsonParser m_json_parser;
|
|
|
|
//--- Tab MCP
|
|
CTextLabel m_label_tit_mcp;
|
|
CTextEdit m_edit_mcp_soket_adress;
|
|
CTextEdit m_edit_mcp_soket_port;
|
|
CTextEdit m_edit_mcp_ea_pool_ms;
|
|
CTextEdit m_edit_mcp_soket_timeout_read_no_tls; // Timeout de lecutra para conexionses no TLS en MS
|
|
// Al hacer clcik se lanza el ea (con los paramtros) en caso exsita
|
|
// se quita y se vuleve a lanzar
|
|
CButton m_btn_mcp_ea_lanzar;
|
|
|
|
//--- Tab conexion por tlg + api
|
|
// Parte de telegram
|
|
CTextLabel m_label_config_tlg;
|
|
CTextEdit m_edit_bot_token;
|
|
CButton m_btn_vis_bot_token;
|
|
CTextEdit m_edit_chat_id;
|
|
CButton m_btn_vis_chat_id;
|
|
CButton m_bottom_basicconfig_save;
|
|
CButton m_bottom_basicconfig_load;
|
|
|
|
// Parte de modelos (final)
|
|
CTextLabel m_label_config_model;
|
|
CComboBox m_combox_models;
|
|
CTextEdit m_edit_apikey;
|
|
CButton m_btn_vis_apikey;
|
|
CTextEdit m_edit_max_tokens;
|
|
|
|
CButton m_bottom_state_conecting; // Conectar \ Desconectar
|
|
CButton m_bottom_chat_save;
|
|
CButton m_bottom_chat_load;
|
|
|
|
//--- Guardado
|
|
string m_base_folder;
|
|
int m_extra_file_flags;
|
|
|
|
//--- Bot telegram + Api
|
|
bool m_in_conexion;
|
|
CChatTelegramAgentLLmBase* m_tlg_bot;
|
|
|
|
//-- Sql
|
|
int m_sql_handle;
|
|
|
|
//--- Mcp
|
|
long m_last_chart_id_mcp_server;
|
|
MqlParam m_mcp_ea_params[7];
|
|
|
|
//---
|
|
void OnClickBtnLLmApi(const long lparam);
|
|
|
|
//--- apply style para campos
|
|
void ApplyEditStyle(CTextEdit& ediT);
|
|
void ApplyLabelTitleStyle(CTextLabel& label);
|
|
void ApplyButtonStyle(CButton& btn);
|
|
|
|
//--- Carga de config basica
|
|
bool SaveBasicConfigTlgm(const string& file_name);
|
|
bool LoadBasicConfigTlgm(string file_name);
|
|
|
|
//--- Creacion de tab para MCP
|
|
bool CreateTlgmTab(CWndCreate* p, CWindow& main_window, int top_gap, int left_gap, int right_gap, int bottom_gap);
|
|
bool CreateMcpTab(CWndCreate* p, CWindow& main_window, int top_gap, int left_gap, int right_gap, int bottom_gap);
|
|
|
|
|
|
public:
|
|
CTabLlmAgentBase(void);
|
|
~CTabLlmAgentBase(void);
|
|
|
|
//---
|
|
void Initialize(const string& base_folder, int extra_file_flags, CChatTelegramAgentLLmBase* tlg_bot,
|
|
const string& exp_path_mcp_ea, const string& tbpid, const string& folder_sql, bool sql_c);
|
|
|
|
|
|
//---
|
|
CChatTelegramAgentLLmBase* ChatTlgm() { return m_tlg_bot; }
|
|
|
|
//---
|
|
void OnLenguajeChange() override final;
|
|
|
|
//---
|
|
bool Create(CWndCreate* p, CWindow& main_window, int top_gap, int left_gap, int right_gap, int bottom_gap);
|
|
|
|
//---
|
|
bool OnClickBottom(const long lparam);
|
|
bool OnTextEdit(const long lparam);
|
|
bool OnChangeComBox(const long lparam);
|
|
};
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
CTabLlmAgentBase::CTabLlmAgentBase(void)
|
|
: CGuiBaseComponent<CLoggerBase>("CTabLlmAgentBase"), m_base_folder(""), m_extra_file_flags(0), m_in_conexion(false), m_tlg_bot(NULL),
|
|
m_last_chart_id_mcp_server(-1), m_sql_handle(INVALID_HANDLE)
|
|
{
|
|
m_mcp_ea_params[0].type = TYPE_STRING; // Expert path
|
|
|
|
//---
|
|
m_mcp_ea_params[1].type = TYPE_STRING; // TbpId
|
|
m_mcp_ea_params[2].type = TYPE_STRING; // Addres
|
|
m_mcp_ea_params[3].type = TYPE_UINT; // Port
|
|
m_mcp_ea_params[4].type = TYPE_INT; // Ms pool
|
|
m_mcp_ea_params[5].type = TYPE_INT; // Timeout ms de lecutra
|
|
m_mcp_ea_params[6].type = TYPE_LONG; // Chart id panel
|
|
m_mcp_ea_params[6].integer_value = ::ChartID();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
CTabLlmAgentBase::~CTabLlmAgentBase(void)
|
|
{
|
|
if(::CheckPointer(m_tlg_bot) == POINTER_DYNAMIC)
|
|
delete m_tlg_bot;
|
|
if(m_last_chart_id_mcp_server != -1)
|
|
{
|
|
::ChartClose(m_last_chart_id_mcp_server);
|
|
}
|
|
if(m_sql_handle != INVALID_HANDLE)
|
|
{
|
|
DatabaseClose(m_sql_handle);
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CTabLlmAgentBase::Initialize(const string &base_folder, int extra_file_flags,
|
|
CChatTelegramAgentLLmBase* tlg_bot, const string& exp_path_mcp_ea,
|
|
const string& tbpid, const string& folder_sql, bool sql_c)
|
|
{
|
|
//---
|
|
const string fn = folder_sql + LLMREG_FILENAME_SQL;
|
|
::ResetLastError();
|
|
m_sql_handle = DatabaseOpen(fn, DATABASE_OPEN_READONLY | (sql_c ? DATABASE_OPEN_COMMON : 0));
|
|
if(m_sql_handle == INVALID_HANDLE)
|
|
{
|
|
LogError(StringFormat("Fallo al abari la db = %s, ultinmo errr =%d", fn, ::GetLastError()), FUNCION_ACTUAL);
|
|
Remover();
|
|
return;
|
|
}
|
|
|
|
//----
|
|
m_extra_file_flags = extra_file_flags;
|
|
m_base_folder = base_folder + TABLLMAGENT_FOLDER_AI;
|
|
m_tlg_bot = tlg_bot;
|
|
m_mcp_ea_params[0].string_value = exp_path_mcp_ea;
|
|
m_mcp_ea_params[1].string_value = tbpid;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CTabLlmAgentBase::ApplyEditStyle(CTextEdit &edit)
|
|
{
|
|
edit.FontSize(TABLLMAGENT_FONT_SIZE);
|
|
edit.Font(TABLLMAGENT_FONT);
|
|
edit.CanvasFontSet();
|
|
edit.LabelColor(TABLLMAGENT_COLOR_TEXT_SECONDARY);
|
|
edit.BackColor(TABLLMAGENT_COLOR_FONDO_SUBTAB_PRESSED);
|
|
edit.GetTextBoxPointer().BackColor(TABLLMAGENT_COLOR_EDIT_BACK);
|
|
edit.GetTextBoxPointer().BorderColor(TABLLMAGENT_COLOR_EDIT_BORDER);
|
|
edit.GetTextBoxPointer().DefaultTextColor(TABLLMAGENT_COLOR_EDIT_TEXT_NORMAL);
|
|
edit.GetTextBoxPointer().LabelColor(TABLLMAGENT_COLOR_EDIT_TEXT_NORMAL);
|
|
edit.GetTextBoxPointer().SelectedBackColor(TABLLMAGENT_COLOR_EDIT_TEXT_SELECTED);
|
|
edit.GetTextBoxPointer().SelectedTextColor(TABLLMAGENT_COLOR_EDIT_TEXT_HIGHLIGHT);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CTabLlmAgentBase::ApplyLabelTitleStyle(CTextLabel &label)
|
|
{
|
|
label.FontSize(TABLLMAGENT_FONT_SIZE_TTL);
|
|
label.Font(TABLLMAGENT_FONT);
|
|
label.LabelColor(TABLLMAGENT_COLOR_TEXT_PRIMARY);
|
|
label.BackColor(TABLLMAGENT_COLOR_FONDO_SUBTAB_PRESSED);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CTabLlmAgentBase::ApplyButtonStyle(CButton &btn)
|
|
{
|
|
btn.FontSize(TABLLMAGENT_FONT_SIZE);
|
|
btn.LabelColor(TABLLMAGENT_COLOR_TEXT_SECONDARY);
|
|
btn.BackColor(TABLLMAGENT_COLOR_BTN_BACK);
|
|
btn.BorderColor(TABLLMAGENT_COLOR_BTN_BORDER);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::Create(CWndCreate *p, CWindow &main_window, int top_gap, int left_gap, int right_gap, int bottom_gap)
|
|
{
|
|
//--- Tab
|
|
string txt[TABLLMAGENT_SUBTABS_TOTAL] =
|
|
{
|
|
m_language[GUIBASE_COMPONENT_NAME(m_tabs) + "_0"],
|
|
m_language[GUIBASE_COMPONENT_NAME(m_tabs) + "_1"]
|
|
};
|
|
int width[TABLLMAGENT_SUBTABS_TOTAL] = {125, 70};
|
|
color clrs[TABLLMAGENT_SUBTABS_TOTAL] = {TABLLMAGENT_COLOR_TEXT_SECONDARY, TABLLMAGENT_COLOR_TEXT_SECONDARY};
|
|
color clrs_pressed[TABLLMAGENT_SUBTABS_TOTAL] = {TABLLMAGENT_COLOR_ACCENT, TABLLMAGENT_COLOR_ACCENT};
|
|
top_gap += 24;
|
|
left_gap += 4;
|
|
right_gap += 4;
|
|
bottom_gap += 4;
|
|
|
|
//---
|
|
m_tabs.BackColor(TABLLMAGENT_COLOR_FONDO_SUBTAB);
|
|
m_tabs.BackColorHover(TABLLMAGENT_COLOR_FONDO_SUBTAB_HOVER);
|
|
m_tabs.BackColorPressed(TABLLMAGENT_COLOR_FONDO_SUBTAB_PRESSED);
|
|
m_tabs.BackColorLocked(TABLLMAGENT_COLOR_FONDO_SUBTAB_LOCKED);
|
|
m_tabs.BorderColor(TABLLMAGENT_COLOR_BORDER);
|
|
m_tabs.BorderColorHover(TABLLMAGENT_COLOR_BORDER_HOVER);
|
|
m_tabs.BorderColorPressed(TABLLMAGENT_COLOR_BORDER_HOVER);
|
|
m_tabs.BorderColorLocked(TABLLMAGENT_COLOR_BORDER);
|
|
|
|
//---
|
|
if(!p.CreateTabs(m_tabs, main_window, 0, m_base_tab, m_base_tab_idx,
|
|
left_gap, top_gap, 0, 0,
|
|
txt, width, clrs, clrs_pressed,
|
|
TABS_TOP, true, true, right_gap, bottom_gap))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_tabs);
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
if(!CreateTlgmTab(p, main_window, top_gap, left_gap, right_gap, bottom_gap))
|
|
return false;
|
|
|
|
//---
|
|
if(!CreateMcpTab(p, main_window, top_gap, left_gap, right_gap, bottom_gap))
|
|
return false;
|
|
|
|
//---
|
|
const string init_file_name = m_base_folder + "init_ai_tab.json";
|
|
if(SaveBasicConfigTlgm(init_file_name))
|
|
m_tlg_bot.GeneralConfig(init_file_name, m_extra_file_flags);
|
|
else
|
|
LogError("Fallo al guardar la configuracion inicial dela tab ia", FUNCION_ACTUAL);
|
|
|
|
//---
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::CreateTlgmTab(CWndCreate *p, CWindow &main_window, int top_gap, int left_gap, int right_gap, int bottom_gap)
|
|
{
|
|
//---
|
|
const int initial_x = left_gap + 5;
|
|
int x = initial_x;
|
|
int y = top_gap + 10;
|
|
string texto;
|
|
int width;
|
|
|
|
//--- Label telegram
|
|
ApplyLabelTitleStyle(m_label_config_tlg);
|
|
if(!p.CreateTextLabel(m_label_config_tlg, m_language[GUIBASE_COMPONENT_NAME(m_label_config_tlg)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 230))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_label_config_tlg);
|
|
return false;
|
|
}
|
|
y += m_label_config_tlg.YSize() + TABLLMAGENT_GAP_Y_FIRST;
|
|
|
|
//--- Bot token
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_bot_token)];
|
|
ApplyEditStyle(m_edit_bot_token);
|
|
width = m_edit_bot_token.m_canvas.TextWidth(texto);
|
|
m_edit_bot_token.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_bot_token)));
|
|
if(!p.CreateTextEdit(m_edit_bot_token, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 425, 425, ""))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_bot_token);
|
|
return false;
|
|
}
|
|
m_edit_bot_token.GetTextBoxPointer().Font(EAFMOD_KEY_FONT);
|
|
|
|
//--- Btn show/hide bot token
|
|
const int edit_y_size_token = m_edit_bot_token.YSize();
|
|
ApplyButtonStyle(m_btn_vis_bot_token);
|
|
m_btn_vis_bot_token.AddImagesGroup(1, 1, g_llmagetn_tab_images_vis_path);
|
|
m_btn_vis_bot_token.ChangeImage(0, EAFMOD_FORKEYS_IMAGES_VIS_CLOSED);
|
|
m_btn_vis_bot_token.XSize(edit_y_size_token);
|
|
m_btn_vis_bot_token.YSize(edit_y_size_token);
|
|
m_btn_vis_bot_token.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_vis_bot_token)));
|
|
if(!p.CreateButton(m_btn_vis_bot_token, "", main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI,
|
|
x + m_edit_bot_token.XSize() + 5, y, edit_y_size_token))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_btn_vis_bot_token);
|
|
return false;
|
|
}
|
|
y += m_edit_bot_token.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- Chat ID
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_chat_id)];
|
|
ApplyEditStyle(m_edit_chat_id);
|
|
width = m_edit_chat_id.m_canvas.TextWidth(texto);
|
|
m_edit_chat_id.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_chat_id)));
|
|
if(!p.CreateTextEdit(m_edit_chat_id, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 300, 300, ""))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_chat_id);
|
|
return false;
|
|
}
|
|
m_edit_chat_id.GetTextBoxPointer().Font(EAFMOD_KEY_FONT);
|
|
|
|
//--- Btn show/hide chat id
|
|
const int edit_y_size_chat = m_edit_chat_id.YSize();
|
|
ApplyButtonStyle(m_btn_vis_chat_id);
|
|
m_btn_vis_chat_id.AddImagesGroup(1, 1, g_llmagetn_tab_images_vis_path);
|
|
m_btn_vis_chat_id.ChangeImage(0, EAFMOD_FORKEYS_IMAGES_VIS_CLOSED);
|
|
m_btn_vis_chat_id.XSize(edit_y_size_chat);
|
|
m_btn_vis_chat_id.YSize(edit_y_size_chat);
|
|
m_btn_vis_chat_id.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_vis_chat_id)));
|
|
if(!p.CreateButton(m_btn_vis_chat_id, "", main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI,
|
|
x + m_edit_chat_id.XSize() + 5, y, edit_y_size_chat))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_btn_vis_chat_id);
|
|
return false;
|
|
}
|
|
y += m_edit_chat_id.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- nueva seccion
|
|
y += TABLLMAGENT_GAP_Y_SECTION;
|
|
x = initial_x;
|
|
|
|
//--- Label modelo
|
|
ApplyLabelTitleStyle(m_label_config_model);
|
|
if(!p.CreateTextLabel(m_label_config_model, m_language[GUIBASE_COMPONENT_NAME(m_label_config_model)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 225))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_label_config_model);
|
|
return false;
|
|
}
|
|
y += m_label_config_model.YSize() + TABLLMAGENT_GAP_Y_FIRST;
|
|
|
|
//--- Combox modelos
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_combox_models)];
|
|
m_combox_models.FontSize(TABLLMAGENT_FONT_SIZE);
|
|
m_combox_models.Font(TABLLMAGENT_FONT);
|
|
m_combox_models.CanvasFontSet();
|
|
m_combox_models.LabelColor(TABLLMAGENT_COLOR_TEXT_SECONDARY);
|
|
m_combox_models.BackColor(TABLLMAGENT_COLOR_FONDO);
|
|
m_combox_models.GetListViewPointer().BackColor(TABLLMAGENT_COLOR_EDIT_BACK);
|
|
m_combox_models.GetListViewPointer().BorderColor(TABLLMAGENT_COLOR_EDIT_BORDER);
|
|
m_combox_models.GetListViewPointer().LabelColor(TABLLMAGENT_COLOR_TEXT_SECONDARY);
|
|
m_combox_models.GetButtonPointer().LabelColor(TABLLMAGENT_COLOR_TEXT_SECONDARY);
|
|
m_combox_models.GetButtonPointer().BackColor(TABLLMAGENT_COLOR_EDIT_BACK);
|
|
m_combox_models.GetButtonPointer().BorderColor(TABLLMAGENT_COLOR_EDIT_BORDER);
|
|
width = m_combox_models.m_canvas.TextWidth(texto);
|
|
m_combox_models.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_combox_models)));
|
|
|
|
// Obtenemos los modelos
|
|
string models[];
|
|
int r = ArrayResize(models, 8, 8);
|
|
int s = 0;
|
|
::ResetLastError();
|
|
const int req = DatabasePrepare(m_sql_handle, StringFormat("SELECT * FROM llm_models WHERE (org_id = '%s' AND (flags & %u) > 0);",
|
|
"groq", LLMDEF_FLAG_TOOLS)); // buscamos los que permitan reasonsin y tooling
|
|
if(req == INVALID_HANDLE)
|
|
{
|
|
LogFatalError(StringFormat("Fallo al hacer req a la base de datos, ultimo err = %d", ::GetLastError()), FUNCION_ACTUAL);
|
|
Remover();
|
|
return false;
|
|
}
|
|
while(DatabaseRead(req))
|
|
{
|
|
DatabaseColumnText(req, LLMIDX_TLLMMODELS_ID, models[s++]);
|
|
if(s >= r)
|
|
{
|
|
r <<= 1;
|
|
ArrayResize(models, r, r);
|
|
}
|
|
}
|
|
DatabaseFinalize(req);
|
|
ArrayResize(models, s);
|
|
DatabaseClose(m_sql_handle);
|
|
m_sql_handle = INVALID_HANDLE;
|
|
|
|
// Creamos
|
|
if(!p.CreateCombobox(m_combox_models, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 150, 150, models, 150))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_combox_models);
|
|
return false;
|
|
}
|
|
m_combox_models.m_button.IconFile(RESOURCE_DOWN_THIN_WHITE);
|
|
m_combox_models.m_button.IconFileLocked(RESOURCE_DOWN_THIN_WHITE);
|
|
m_combox_models.m_button.CElement::IconFilePressed(RESOURCE_UP_THIN_WHITE);
|
|
m_combox_models.m_button.CElement::IconFilePressedLocked(RESOURCE_UP_THIN_WHITE);
|
|
x += m_combox_models.XSize() + 20;
|
|
|
|
//--- Max tokens
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_max_tokens)];
|
|
ApplyEditStyle(m_edit_max_tokens);
|
|
width = m_edit_max_tokens.m_canvas.TextWidth(texto);
|
|
m_edit_max_tokens.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_max_tokens)));
|
|
if(!p.CreateTextEdit(m_edit_max_tokens, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 100, 100, "1024"))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_max_tokens);
|
|
return false;
|
|
}
|
|
y += m_combox_models.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
x = initial_x;
|
|
|
|
//--- API Key
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_apikey)];
|
|
ApplyEditStyle(m_edit_apikey);
|
|
width = m_edit_apikey.m_canvas.TextWidth(texto);
|
|
m_edit_apikey.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_apikey)));
|
|
if(!p.CreateTextEdit(m_edit_apikey, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 400, 400, ""))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_apikey);
|
|
return false;
|
|
}
|
|
m_edit_apikey.GetTextBoxPointer().Font(EAFMOD_KEY_FONT);
|
|
|
|
//--- Btn show/hide api key
|
|
const int edit_y_size = m_edit_apikey.YSize();
|
|
ApplyButtonStyle(m_btn_vis_apikey);
|
|
m_btn_vis_apikey.AddImagesGroup(1, 1, g_llmagetn_tab_images_vis_path);
|
|
m_btn_vis_apikey.ChangeImage(0, EAFMOD_FORKEYS_IMAGES_VIS_CLOSED);
|
|
m_btn_vis_apikey.XSize(edit_y_size);
|
|
m_btn_vis_apikey.YSize(edit_y_size);
|
|
m_btn_vis_apikey.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_vis_apikey)));
|
|
if(!p.CreateButton(m_btn_vis_apikey, "", main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI,
|
|
x + m_edit_apikey.XSize() + 5, y, edit_y_size))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_btn_vis_apikey);
|
|
return false;
|
|
}
|
|
y += m_edit_apikey.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- Fila botones: Conectar + Load Config + Save Config
|
|
ApplyButtonStyle(m_bottom_state_conecting);
|
|
m_bottom_state_conecting.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_state_conecting)));
|
|
if(!p.CreateButton(m_bottom_state_conecting, m_language[GUIBASE_COMPONENT_NAME(m_bottom_state_conecting)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 125))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_bottom_state_conecting);
|
|
return false;
|
|
}
|
|
x += m_bottom_state_conecting.XSize() + 10;
|
|
|
|
ApplyButtonStyle(m_bottom_basicconfig_load);
|
|
m_bottom_basicconfig_load.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_basicconfig_load)));
|
|
if(!p.CreateButton(m_bottom_basicconfig_load, m_language[GUIBASE_COMPONENT_NAME(m_bottom_basicconfig_load)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 125))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_bottom_basicconfig_load);
|
|
return false;
|
|
}
|
|
x += m_bottom_basicconfig_load.XSize() + 10;
|
|
|
|
ApplyButtonStyle(m_bottom_basicconfig_save);
|
|
m_bottom_basicconfig_save.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_basicconfig_save)));
|
|
if(!p.CreateButton(m_bottom_basicconfig_save, m_language[GUIBASE_COMPONENT_NAME(m_bottom_basicconfig_save)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 125))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_bottom_basicconfig_save);
|
|
return false;
|
|
}
|
|
|
|
//--- Fila botones: Load Chat + Save Chat
|
|
x = initial_x;
|
|
y += m_bottom_basicconfig_save.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
ApplyButtonStyle(m_bottom_chat_load);
|
|
m_bottom_chat_load.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_chat_load)));
|
|
if(!p.CreateButton(m_bottom_chat_load, m_language[GUIBASE_COMPONENT_NAME(m_bottom_chat_load)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 125))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_bottom_chat_load);
|
|
return false;
|
|
}
|
|
x += m_bottom_chat_load.XSize() + 10;
|
|
|
|
ApplyButtonStyle(m_bottom_chat_save);
|
|
m_bottom_chat_save.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_chat_save)));
|
|
if(!p.CreateButton(m_bottom_chat_save, m_language[GUIBASE_COMPONENT_NAME(m_bottom_chat_save)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_TLGMAPI, x, y, 125))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_bottom_chat_save);
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::CreateMcpTab(CWndCreate *p, CWindow &main_window, int top_gap, int left_gap, int right_gap, int bottom_gap)
|
|
{
|
|
//---
|
|
const int initial_x = left_gap + 5;
|
|
int x = initial_x;
|
|
int y = top_gap + 10;
|
|
string texto;
|
|
int width;
|
|
|
|
//--- Label titulo MCP
|
|
ApplyLabelTitleStyle(m_label_tit_mcp);
|
|
if(!p.CreateTextLabel(m_label_tit_mcp, m_language[GUIBASE_COMPONENT_NAME(m_label_tit_mcp)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_MCP, x, y, 230))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_label_tit_mcp);
|
|
return false;
|
|
}
|
|
y += m_label_tit_mcp.YSize() + TABLLMAGENT_GAP_Y_FIRST;
|
|
|
|
//--- Socket address
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_adress)];
|
|
ApplyEditStyle(m_edit_mcp_soket_adress);
|
|
width = m_edit_mcp_soket_adress.m_canvas.TextWidth(texto);
|
|
m_edit_mcp_soket_adress.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_adress)));
|
|
if(!p.CreateTextEdit(m_edit_mcp_soket_adress, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_MCP, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 300, 300, "127.0.0.1"))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_mcp_soket_adress);
|
|
return false;
|
|
}
|
|
y += m_edit_mcp_soket_adress.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- Socket port
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_port)];
|
|
ApplyEditStyle(m_edit_mcp_soket_port);
|
|
width = m_edit_mcp_soket_port.m_canvas.TextWidth(texto);
|
|
m_edit_mcp_soket_port.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_port)));
|
|
if(!p.CreateTextEdit(m_edit_mcp_soket_port, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_MCP, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 150, 150, "8080"))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_mcp_soket_port);
|
|
return false;
|
|
}
|
|
y += m_edit_mcp_soket_port.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- Pool ms
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_mcp_ea_pool_ms)];
|
|
ApplyEditStyle(m_edit_mcp_ea_pool_ms);
|
|
width = m_edit_mcp_ea_pool_ms.m_canvas.TextWidth(texto);
|
|
m_edit_mcp_ea_pool_ms.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_mcp_ea_pool_ms)));
|
|
if(!p.CreateTextEdit(m_edit_mcp_ea_pool_ms, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_MCP, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 150, 150, "75"))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_mcp_ea_pool_ms);
|
|
return false;
|
|
}
|
|
y += m_edit_mcp_ea_pool_ms.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- Timeout lectura no TLS
|
|
texto = m_language[GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_timeout_read_no_tls)];
|
|
ApplyEditStyle(m_edit_mcp_soket_timeout_read_no_tls);
|
|
width = m_edit_mcp_soket_timeout_read_no_tls.m_canvas.TextWidth(texto);
|
|
m_edit_mcp_soket_timeout_read_no_tls.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_timeout_read_no_tls)));
|
|
if(!p.CreateTextEdit(m_edit_mcp_soket_timeout_read_no_tls, texto,
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_MCP, false, x, y,
|
|
width + TABLLMAGENT_LABEL_X_PAD + 150, 150, "5000"))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_edit_mcp_soket_timeout_read_no_tls);
|
|
return false;
|
|
}
|
|
y += m_edit_mcp_soket_timeout_read_no_tls.YSize() + TABLLMAGENT_GAP_Y_SEC;
|
|
|
|
//--- Btn lanzar EA
|
|
ApplyButtonStyle(m_btn_mcp_ea_lanzar);
|
|
m_btn_mcp_ea_lanzar.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_mcp_ea_lanzar)));
|
|
if(!p.CreateButton(m_btn_mcp_ea_lanzar, m_language[GUIBASE_COMPONENT_NAME(m_btn_mcp_ea_lanzar)],
|
|
main_window, 0, m_tabs, TABLLMAGENT_SUBTAB_MCP, x, y, 125))
|
|
{
|
|
GUIBASE_ERROR_CREATION(m_btn_mcp_ea_lanzar);
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CTabLlmAgentBase::OnLenguajeChange(void)
|
|
{
|
|
//--- Tab text
|
|
string txt[TABLLMAGENT_SUBTABS_TOTAL] =
|
|
{
|
|
m_language[GUIBASE_COMPONENT_NAME(m_tabs) + "_0"],
|
|
m_language[GUIBASE_COMPONENT_NAME(m_tabs) + "_1"]
|
|
};
|
|
const int t = m_tabs.TabsTotal();
|
|
for(int i = 0; i < t; i++)
|
|
m_tabs.Text(i, txt[i]);
|
|
m_tabs.Update();
|
|
|
|
//--- Labels tlgm
|
|
UpdateTBasic(m_label_config_tlg, GUIBASE_COMPONENT_NAME(m_label_config_tlg), false);
|
|
UpdateTBasic(m_label_config_model, GUIBASE_COMPONENT_NAME(m_label_config_model), false);
|
|
|
|
//--- Edits tlgm
|
|
ResizeTElement(m_edit_bot_token, GUIBASE_COMPONENT_NAME(m_edit_bot_token), 425, TABLLMAGENT_LABEL_X_PAD);
|
|
ResizeTElement(m_edit_chat_id, GUIBASE_COMPONENT_NAME(m_edit_chat_id), 300, TABLLMAGENT_LABEL_X_PAD);
|
|
ResizeTElement(m_edit_apikey, GUIBASE_COMPONENT_NAME(m_edit_apikey), 400, TABLLMAGENT_LABEL_X_PAD);
|
|
ResizeTElement(m_edit_max_tokens, GUIBASE_COMPONENT_NAME(m_edit_max_tokens), 100, TABLLMAGENT_LABEL_X_PAD);
|
|
|
|
//--- Combox
|
|
ResizeTElement(m_combox_models, GUIBASE_COMPONENT_NAME(m_combox_models), 150, TABLLMAGENT_LABEL_X_PAD);
|
|
|
|
//--- Botones tlgm
|
|
UpdateTBasic(m_bottom_basicconfig_load, GUIBASE_COMPONENT_NAME(m_bottom_basicconfig_load));
|
|
UpdateTBasic(m_bottom_basicconfig_save, GUIBASE_COMPONENT_NAME(m_bottom_basicconfig_save));
|
|
UpdateTBasic(m_bottom_chat_load, GUIBASE_COMPONENT_NAME(m_bottom_chat_load));
|
|
UpdateTBasic(m_bottom_chat_save, GUIBASE_COMPONENT_NAME(m_bottom_chat_save));
|
|
|
|
//--- Conectar (key dinamica segun estado)
|
|
UpdateTBasic(m_bottom_state_conecting,
|
|
GUIBASE_COMPONENT_NAME(m_bottom_state_conecting) + (m_in_conexion ? "_d" : ""));
|
|
|
|
//--- Show/hide solo tooltip
|
|
m_btn_vis_bot_token.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_vis_bot_token)));
|
|
m_btn_vis_chat_id.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_vis_chat_id)));
|
|
m_btn_vis_apikey.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_btn_vis_apikey)));
|
|
|
|
//--- Label MCP
|
|
UpdateTBasic(m_label_tit_mcp, GUIBASE_COMPONENT_NAME(m_label_tit_mcp), false);
|
|
|
|
//--- Edits MCP
|
|
ResizeTElement(m_edit_mcp_soket_adress, GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_adress), 300, TABLLMAGENT_LABEL_X_PAD);
|
|
ResizeTElement(m_edit_mcp_soket_port, GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_port), 150, TABLLMAGENT_LABEL_X_PAD);
|
|
ResizeTElement(m_edit_mcp_ea_pool_ms, GUIBASE_COMPONENT_NAME(m_edit_mcp_ea_pool_ms), 150, TABLLMAGENT_LABEL_X_PAD);
|
|
ResizeTElement(m_edit_mcp_soket_timeout_read_no_tls, GUIBASE_COMPONENT_NAME(m_edit_mcp_soket_timeout_read_no_tls), 150, TABLLMAGENT_LABEL_X_PAD);
|
|
|
|
//--- Boton MCP
|
|
UpdateTBasic(m_btn_mcp_ea_lanzar, GUIBASE_COMPONENT_NAME(m_btn_mcp_ea_lanzar));
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::OnChangeComBox(const long lparam)
|
|
{
|
|
if(m_combox_models.Id() == lparam)
|
|
{
|
|
m_tlg_bot.LlmModelName(m_combox_models.GetListViewPointer().SelectedItemText());
|
|
//---
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::OnTextEdit(const long lparam)
|
|
{
|
|
if(m_tabs.SelectedTab() == TABLLMAGENT_SUBTAB_TLGMAPI)
|
|
{
|
|
//--- Telegram
|
|
if(lparam == m_edit_bot_token.Id())
|
|
{
|
|
m_tlg_bot.TlgToken(m_edit_bot_token.GetValue());
|
|
return true;
|
|
}
|
|
if(lparam == m_edit_chat_id.Id())
|
|
{
|
|
const long chat_id = long(m_edit_chat_id.GetValue());
|
|
m_tlg_bot.TlgChatId(chat_id);
|
|
return true;
|
|
}
|
|
|
|
//--- LLm
|
|
if(lparam == m_edit_apikey.Id())
|
|
{
|
|
const string apikey = m_edit_apikey.GetValue();
|
|
m_tlg_bot.LlmApiKey(apikey);
|
|
return true;
|
|
}
|
|
if(lparam == m_edit_max_tokens.Id())
|
|
{
|
|
m_tlg_bot.LLmMaxTokens(int(m_edit_max_tokens.GetValue()));
|
|
return true;
|
|
}
|
|
}
|
|
/*
|
|
// Nota no hace fata capturarlo
|
|
else
|
|
{
|
|
if(lparam == m_edit_mcp_soket_adress.Id())
|
|
{
|
|
return true;
|
|
}
|
|
if(lparam == m_edit_mcp_soket_port.Id())
|
|
{
|
|
return true;
|
|
}
|
|
if(lparam == m_edit_mcp_ea_pool_ms.Id())
|
|
{
|
|
return true;
|
|
}
|
|
}*/
|
|
|
|
//---
|
|
return false;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CTabLlmAgentBase::OnClickBtnLLmApi(const long lparam)
|
|
{
|
|
//--- Botonoes de visualizacion de pass
|
|
if(m_btn_vis_bot_token.Id() == lparam)
|
|
{
|
|
CTextBox* tb = m_edit_bot_token.GetTextBoxPointer();
|
|
const bool is_hidden = tb.Font() == EAFMOD_KEY_FONT;
|
|
tb.ChangeFont(is_hidden ? TABLLMAGENT_FONT : EAFMOD_KEY_FONT, TABLLMAGENT_FONT_SIZE);
|
|
m_btn_vis_bot_token.SetImage(0, 0, g_llmagetn_tab_images_vis_path[is_hidden ? EAFMOD_FORKEYS_IMAGES_VIS_OPEN : EAFMOD_FORKEYS_IMAGES_VIS_CLOSED]);
|
|
m_btn_vis_bot_token.Update(true);
|
|
return;
|
|
}
|
|
if(m_btn_vis_chat_id.Id() == lparam)
|
|
{
|
|
CTextBox* tb = m_edit_chat_id.GetTextBoxPointer();
|
|
const bool is_hidden = tb.Font() == EAFMOD_KEY_FONT;
|
|
tb.ChangeFont(is_hidden ? TABLLMAGENT_FONT : EAFMOD_KEY_FONT, TABLLMAGENT_FONT_SIZE);
|
|
m_btn_vis_chat_id.SetImage(0, 0, g_llmagetn_tab_images_vis_path[is_hidden ? EAFMOD_FORKEYS_IMAGES_VIS_OPEN : EAFMOD_FORKEYS_IMAGES_VIS_CLOSED]);
|
|
m_btn_vis_chat_id.Update(true);
|
|
return;
|
|
}
|
|
if(m_btn_vis_apikey.Id() == lparam)
|
|
{
|
|
CTextBox* tb = m_edit_apikey.GetTextBoxPointer();
|
|
const bool is_hidden = tb.Font() == EAFMOD_KEY_FONT;
|
|
tb.ChangeFont(is_hidden ? TABLLMAGENT_FONT : EAFMOD_KEY_FONT, TABLLMAGENT_FONT_SIZE);
|
|
m_btn_vis_apikey.SetImage(0, 0, g_llmagetn_tab_images_vis_path[is_hidden ? EAFMOD_FORKEYS_IMAGES_VIS_OPEN : EAFMOD_FORKEYS_IMAGES_VIS_CLOSED]);
|
|
m_btn_vis_apikey.Update(true);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_bottom_state_conecting.Id() == lparam)
|
|
{
|
|
m_in_conexion = !m_in_conexion;
|
|
if(m_in_conexion)
|
|
{
|
|
m_bottom_state_conecting.LabelText(m_language[GUIBASE_COMPONENT_NAME(m_bottom_state_conecting) + "_d"]); // esta conectado el siguiente estado es desconectar
|
|
m_bottom_state_conecting.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_state_conecting) + "_d"));
|
|
m_bottom_state_conecting.Update(true);
|
|
m_tlg_bot.TlgConnectReconect(true);
|
|
}
|
|
else
|
|
{
|
|
m_bottom_state_conecting.LabelText(m_language[GUIBASE_COMPONENT_NAME(m_bottom_state_conecting)]); // el siguiente estado es coectart
|
|
m_bottom_state_conecting.Tooltip(m_language.Tooltip(GUIBASE_COMPONENT_NAME(m_bottom_state_conecting)));
|
|
m_bottom_state_conecting.Update(true);
|
|
m_tlg_bot.TlgConnectReconect(false);
|
|
}
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_bottom_basicconfig_load.Id() == lparam)
|
|
{
|
|
if(::FileSelectDialog(GUIBASE_MSG("selec_config_load"), m_base_folder, "JSON files (*.json)|*.json",
|
|
((m_extra_file_flags & FILE_COMMON) != 0 ? FSD_COMMON_FOLDER : 0) | FSD_FILE_MUST_EXIST,
|
|
g_tab_llm_agent_base, NULL) != 1)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_selec_file"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(LoadBasicConfigTlgm(g_tab_llm_agent_base[0]))
|
|
MessageBox(GUIBASE_MSG("suces_load_config"), GUIBASE_COMMON("info"), MB_OK | MB_ICONINFORMATION);
|
|
else
|
|
MessageBox(GUIBASE_MSG("err_load_config"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
|
|
//---
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_bottom_basicconfig_save.Id() == lparam)
|
|
{
|
|
if(::FileSelectDialog(GUIBASE_MSG("selec_config_save"), m_base_folder, "JSON files (*.json)|*.json",
|
|
((m_extra_file_flags & FILE_COMMON) != 0 ? FSD_COMMON_FOLDER : 0),
|
|
g_tab_llm_agent_base, NULL) != 1)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_selec_file"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(SaveBasicConfigTlgm(g_tab_llm_agent_base[0]))
|
|
MessageBox(GUIBASE_MSG("suces_save_config"), GUIBASE_COMMON("info"), MB_OK | MB_ICONINFORMATION);
|
|
else
|
|
MessageBox(GUIBASE_MSG("err_save_config"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
|
|
//---
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_bottom_chat_load.Id() == lparam)
|
|
{
|
|
if(::FileSelectDialog(GUIBASE_MSG("selec_chat_load"), m_base_folder, "JSON files (*.json)|*.json",
|
|
((m_extra_file_flags & FILE_COMMON) != 0 ? FSD_COMMON_FOLDER : 0) | FSD_FILE_MUST_EXIST,
|
|
g_tab_llm_agent_base, NULL) != 1)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_selec_file"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_tlg_bot.LLmMemoryLoad(g_tab_llm_agent_base[0], m_extra_file_flags))
|
|
MessageBox(GUIBASE_MSG("suces_load_chat"), GUIBASE_COMMON("info"), MB_OK | MB_ICONINFORMATION);
|
|
else
|
|
MessageBox(GUIBASE_MSG("err_load_chat"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
|
|
//---
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_bottom_chat_save.Id() == lparam)
|
|
{
|
|
if(::FileSelectDialog(GUIBASE_MSG("selec_chat_save"), m_base_folder, "JSON files (*.json)|*.json",
|
|
((m_extra_file_flags & FILE_COMMON) != 0 ? FSD_COMMON_FOLDER : 0),
|
|
g_tab_llm_agent_base, NULL) != 1)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_selec_file"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(m_tlg_bot.LLmMemorySave(g_tab_llm_agent_base[0], m_extra_file_flags))
|
|
MessageBox(GUIBASE_MSG("succes_save_chat"), GUIBASE_COMMON("info"), MB_OK | MB_ICONINFORMATION);
|
|
else
|
|
MessageBox(GUIBASE_MSG("err_save_chat"), GUIBASE_COMMON("error"), MB_OK | MB_ICONERROR);
|
|
|
|
//---
|
|
return;
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::OnClickBottom(const long lparam)
|
|
{
|
|
//---
|
|
if(m_tabs.SelectedTab() == TABLLMAGENT_SUBTAB_TLGMAPI)
|
|
{
|
|
OnClickBtnLLmApi(lparam);
|
|
return true;
|
|
}
|
|
else
|
|
if(m_tabs.SelectedTab() == TABLLMAGENT_SUBTAB_MCP && lparam == m_btn_mcp_ea_lanzar.Id())
|
|
{
|
|
//--- En caos este correidno relanzamos
|
|
if(m_last_chart_id_mcp_server >= 0)
|
|
{
|
|
::ChartClose(m_last_chart_id_mcp_server);
|
|
m_last_chart_id_mcp_server = -1;
|
|
}
|
|
|
|
//--- Abrimos grafico
|
|
m_last_chart_id_mcp_server = OpenChartAndDevoler(ChartID(), _Symbol, _Period, 250);
|
|
if(m_last_chart_id_mcp_server == -1)
|
|
{
|
|
// Fallo al lanzarlo no se pudo abrir el grafico
|
|
MessageBox(GUIBASE_MSG("err_mcp_not_open_c"), GUIBASE_COMMON("error"), MB_OK);
|
|
return true;
|
|
}
|
|
// Se abrio el grafico
|
|
|
|
//---
|
|
const string addres = m_edit_mcp_soket_adress.GetValue();
|
|
if(addres.Length() < 1)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_mcp_empy_address"), GUIBASE_COMMON("error"), MB_OK);
|
|
return true;
|
|
}
|
|
|
|
//---
|
|
const int port = int(m_edit_mcp_soket_port.GetValue());
|
|
if(port > 65535 || port <= 0)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_mcp_invalid_port"), GUIBASE_COMMON("error"), MB_OK);
|
|
return true;
|
|
}
|
|
|
|
//---
|
|
const int ms_pool = int(m_edit_mcp_ea_pool_ms.GetValue());
|
|
if(ms_pool < 10)
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_pool_is_too_pequeño"), GUIBASE_COMMON("error"), MB_OK);
|
|
return true;
|
|
}
|
|
|
|
//---
|
|
//m_mcp_ea_params[0]=esta la ruta al experto
|
|
//m_mcp_ea_params[1]=tbp id
|
|
m_mcp_ea_params[2].string_value = addres;
|
|
m_mcp_ea_params[3].integer_value = port;
|
|
m_mcp_ea_params[4].integer_value = ms_pool;
|
|
m_mcp_ea_params[5].integer_value = int(m_edit_mcp_soket_timeout_read_no_tls.GetValue()); // no revisamos dado que depende...
|
|
//m_mcp_ea_params[6]=chart id
|
|
|
|
//---
|
|
if(!EXPERT::Run(m_last_chart_id_mcp_server, m_mcp_ea_params, EXPERT_PERMISOS_FLAG_DLL))
|
|
{
|
|
MessageBox(GUIBASE_MSG("err_cannot_run_ea"), GUIBASE_COMMON("error"), MB_OK);
|
|
}
|
|
return true;
|
|
}
|
|
//---
|
|
return false;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Save \\ Load config para telegram + api tab |
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::SaveBasicConfigTlgm(const string& file_name)
|
|
{
|
|
//---
|
|
TSN::g_json_builder.Clear();
|
|
TSN::g_json_builder.Obj();
|
|
TSN::g_json_builder.Key("bot_token").ValSNoRef(m_edit_bot_token.GetValue());
|
|
TSN::g_json_builder.Key("chat_id").ValSNoRef(m_edit_chat_id.GetValue());
|
|
TSN::g_json_builder.Key("api_key").ValSNoRef(m_edit_apikey.GetValue());
|
|
TSN::g_json_builder.Key("max_completion_tokens").Val(long(m_edit_max_tokens.GetValue()));
|
|
TSN::g_json_builder.Key("model_name").ValSNoRef(m_combox_models.GetListViewPointer().SelectedItemText());
|
|
TSN::g_json_builder.EndObj();
|
|
|
|
//---
|
|
::ResetLastError();
|
|
const int fh = ::FileOpen(file_name, FILE_WRITE | FILE_TXT | m_extra_file_flags, 0);
|
|
if(fh == INVALID_HANDLE)
|
|
{
|
|
LogError(StringFormat("Fallo al abrir archivo =%s, error=%d", file_name, ::GetLastError()), FUNCION_ACTUAL);
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
::FileWriteString(fh, TSN::g_json_builder.Build());
|
|
::FileClose(fh);
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
bool CTabLlmAgentBase::LoadBasicConfigTlgm(string file_name)
|
|
{
|
|
//---
|
|
const int ext = m_json_parser.AssingFile(file_name, (m_extra_file_flags & FILE_COMMON) != 0);
|
|
if(!m_json_parser.AutoParseByFileExt(ext))
|
|
{
|
|
LogError(StringFormat("Fallo al parsear json =%s, error=%s", file_name,
|
|
::EnumToString(m_json_parser.LastErr())), FUNCION_ACTUAL);
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
TSN::CJsonNode root = m_json_parser.GetRoot();
|
|
|
|
//--- Acutlizamos la ui
|
|
m_edit_bot_token.SetValue(root["bot_token"].ToString());
|
|
m_edit_bot_token.GetTextBoxPointer().Update(true);
|
|
|
|
m_edit_chat_id.SetValue(root["chat_id"].ToString());
|
|
m_edit_chat_id.GetTextBoxPointer().Update(true);
|
|
|
|
m_edit_apikey.SetValue(root["api_key"].ToString());
|
|
m_edit_apikey.GetTextBoxPointer().Update(true);
|
|
|
|
m_edit_max_tokens.SetValue(root["max_completion_tokens"].ToString());
|
|
m_edit_max_tokens.GetTextBoxPointer().Update(true);
|
|
|
|
const string m = root["model_name"].ToString("");
|
|
CListView* list = m_combox_models.GetListViewPointer();
|
|
const int model_idx = list.Find(m);
|
|
if(model_idx != -1)
|
|
{
|
|
m_combox_models.GetListViewPointer().SelectItem(model_idx);
|
|
m_combox_models.Update(true);
|
|
}
|
|
else
|
|
{
|
|
LogError("No se pudo seleicoinar el modelo en combox dado que no existe", FUNCION_ACTUAL);
|
|
}
|
|
|
|
//---
|
|
const string out = FileRemoveExtension(file_name) + "." + TSN_JSON_EXT_JSONTC;
|
|
if(!m_json_parser.SaveCompiled(out, ((m_extra_file_flags & FILE_COMMON) != 0)))
|
|
{
|
|
LogError("Fallo al guardar version compilada", FUNCION_ACTUAL);
|
|
return false;
|
|
}
|
|
|
|
//--- Aplicar al bot de tlgm externo mediante call
|
|
m_tlg_bot.GeneralConfig(out, m_extra_file_flags);
|
|
|
|
//---
|
|
return true;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
#endif // AIFULLTAB_SRC_TAB_BASETAB_MQH
|