forked from nique_372/LLmRegiteryByLeo
180 lines
No EOL
6 KiB
Markdown
180 lines
No EOL
6 KiB
Markdown
<p align="center">
|
|
<img src="https://img.shields.io/badge/Language-MQL5%20%7C%20SQL-1B6CA8?style=flat-square"/>
|
|
<img src="https://img.shields.io/badge/Platform-MetaTrader%205-0D1B2A?style=flat-square"/>
|
|
<img src="https://img.shields.io/badge/Author-nique__372-C9D6DF?style=flat-square&logoColor=white"/>
|
|
<img src="https://img.shields.io/badge/MQL5.com-nique__372-1B6CA8?style=flat-square"/>
|
|
</p>
|
|
|
|
<p align="center">
|
|
A lightweight and fast MT5 module that keeps a local SQLite mirror of the <a href="https://models.dev/api.json">models.dev</a> LLM registry.<br/> Fetches the full catalog (orgs + models: cost, context windows, modalities, flags) via WebRequest, persists it to a shared SQLite database, and notifies subscribed charts on every update.
|
|
</p>
|
|
|
|
---
|
|
|
|
## Main Features
|
|
|
|
- **Self-updating registry**: on init, downloads `https://models.dev/api.json` and upserts every org/model into a local SQLite database (`llm_orgs`, `llm_models`)
|
|
- **Scheduled refresh**: configurable update interval (`InpHorasUpdate`), re-syncs automatically via `OnTimer`
|
|
- **Retry with backoff**: failed fetches/writes are retried up to `InpMaxIntentos` times, waiting `InpSegundosTry` seconds between attempts, before falling back to the next full cycle
|
|
- **Shared or local storage**: files can live in the MT5 common folder (`InpFilesInCommonFolder`) so multiple charts/EAs share one database
|
|
- **Cross-chart notifications**: on a successful sync, emits `EventChartCustom` (`LLMREG_ON_UPDATE`) to every chart registered in the `charts_id` table
|
|
- **Compact model schema**: cost (in/out), release/update dates, context window/input/output, and bitflags for `tools`, `temperature`, `reasoning`, `open_weights`, `structured_output`, plus input/output modalities (`text`, `audio`, `video`, `image`, `pdf`)
|
|
|
|
### Registry service (drop-in EA/module)
|
|
|
|
```mql5
|
|
input string InpFolderNameBase = "LLmRegistery\\";
|
|
input bool InpFilesInCommonFolder = true;
|
|
input int InpHorasUpdate = 8;
|
|
input int InpMaxIntentos = 5;
|
|
input int InpSegundosTry = 100;
|
|
input int InpTimeoutWebReqeuestMs = 60000;
|
|
input ENUM_VERBOSE_LOG_LEVEL InpLogLevel = VERBOSE_LOG_LEVEL_ALL;
|
|
|
|
TSN::CLlmRegistery g_llm_registery;
|
|
|
|
int OnInit()
|
|
{
|
|
g_llm_registery.AddLogFlags(InpLogLevel);
|
|
if(!g_llm_registery.Init(InpFolderNameBase, InpFilesInCommonFolder, InpHorasUpdate,
|
|
InpMaxIntentos, InpSegundosTry, InpTimeoutWebReqeuestMs))
|
|
return INIT_FAILED;
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
|
|
void OnTimer()
|
|
{
|
|
g_llm_registery.OnTimerEvent();
|
|
}
|
|
```
|
|
|
|
### Subscribing to updates from another chart
|
|
|
|
```mql5
|
|
#include <TSN\\LLM\\RegDef.mqh>
|
|
|
|
int g_sql_handle = INVALID_HANDLE;
|
|
const long g_my = ChartID();
|
|
|
|
int OnInit()
|
|
{
|
|
g_sql_handle = DatabaseOpen(InpEaServerFoderName + LLMREG_FILENAME_SQL,
|
|
DATABASE_OPEN_READWRITE | (InpEaFilesInCommonFolder ? DATABASE_OPEN_COMMON : 0));
|
|
DatabaseExecute(g_sql_handle, StringFormat("INSERT OR IGNORE INTO charts_id (chart_id) VALUES(%I64d)", g_my));
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
|
|
void OnChartEvent(const int32_t id, const long &lparam, const double &dparam, const string &sparam)
|
|
{
|
|
if(id == CHARTEVENT_CUSTOM + LLMREG_ON_UPDATE)
|
|
Print("Base de datos de modelos ha sido actulizada");
|
|
}
|
|
|
|
void OnDeinit(const int reason)
|
|
{
|
|
DatabaseExecute(g_sql_handle, StringFormat("DELETE FROM charts_id WHERE chart_id = %I64d;", g_my));
|
|
DatabaseClose(g_sql_handle);
|
|
}
|
|
```
|
|
|
|
### Querying the registry (SQL)
|
|
|
|
```sql
|
|
SELECT m.name, m.cost_in, m.cost_out, m.context_window
|
|
FROM llm_models m
|
|
JOIN llm_orgs o ON o.id = m.org_id
|
|
WHERE o.id = 'anthropic'
|
|
ORDER BY m.last_update_date DESC;
|
|
```
|
|
|
|
---
|
|
|
|
## Schema
|
|
|
|
```
|
|
llm_orgs
|
|
├── id (PK)
|
|
├── name
|
|
├── doc
|
|
└── updated_at
|
|
|
|
llm_models
|
|
├── id, org_id (PK, FK -> llm_orgs.id)
|
|
├── name, description
|
|
├── cost_in, cost_out
|
|
├── release_date, last_update_date
|
|
├── flags (tools | temperature | open_weights | reasoning | structured_output)
|
|
├── in_modals / out_modals (text | audio | video | image | pdf)
|
|
├── context_window / context_output / context_input
|
|
└── updated_at
|
|
|
|
charts_id
|
|
└── chart_id (PK) -- charts subscribed to update notifications
|
|
```
|
|
|
|
Full definition in [Src/Init.sql](Src/Init.sql).
|
|
|
|
---
|
|
|
|
## Repository Structure
|
|
|
|
```
|
|
LLmRegiteryByLeo/
|
|
├── Src/
|
|
│ ├── Main.mqh # CLlmRegistery: fetch, parse, upsert, notify, retry logic
|
|
│ ├── Def.mqh # Structs, flags, modal defines, index constants
|
|
│ ├── Init.sql # SQLite schema (orgs, models, charts_id)
|
|
│ └── EnumReg/ # Modal string -> flag enum registry
|
|
├── Test/
|
|
│ └── TestHooks.mq5 # Minimal subscriber example (chart hook)
|
|
└── RegisteryService.mq5 # Main EA/module entry point
|
|
```
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
**[Read Full License](./LICENSE)**
|
|
By downloading or using this repository, you accept the license terms.
|
|
|
|
---
|
|
|
|
## Requirements
|
|
|
|
See [dependencies.json](./dependencies.json) for the full list.
|
|
|
|
- MetaTrader 5, build 5430+
|
|
- WebRequest access enabled for `https://models.dev` (Tools → Options → Expert Advisors)
|
|
|
|
---
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
cd "C:\Users\YOUR_USER\AppData\Roaming\MetaQuotes\Terminal\YOUR_ID\MQL5\Shared Projects"
|
|
tsndep install "https://forge.mql5.io/nique_372/LLmRegiteryByLeo.git"
|
|
```
|
|
|
|
Requires the `tsndep` package, available on [PyPI](https://pypi.org/project/tsndep). It automatically downloads and installs all declared dependencies.
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
**1. Add the URL to WebRequest allowed list:**
|
|
|
|
```
|
|
https://models.dev
|
|
```
|
|
|
|
**2. Attach `RegisteryService.mq5` to a chart** (once, as a background service). It creates/updates `LLmRegistery.db` and `Registery.json` in the shared folder.
|
|
|
|
**3. From any other EA, open the shared database and query it directly**, or subscribe to `LLMREG_ON_UPDATE` via `OnChartEvent` as shown in [Subscribing to updates](#subscribing-to-updates-from-another-chart).
|
|
|
|
---
|
|
|
|
## Contact
|
|
|
|
- **Platform:** [MQL5 Community](https://www.mql5.com/es/users/nique_372)
|
|
- **Profile:** https://www.mql5.com/es/users/nique_372
|
|
- **Articles:** https://www.mql5.com/es/users/nique_372/publications |