Search
Write a publication
Pull to refresh
29
0.9
Геннадий Малинин @HemulGM

Программист Delphi

Send message

Добавил в клиент ChatGPT возможность создавать и использовать внешние функции:

Для примера сделал две команды: "Узнать погоду" и "Выполнить команду через cmd"

Функции чата GPT - это механизм их API, который позволяет GPT вызывать по необходимости функции, которые вы регистрируете (отправляете в запросе как доступные) и работать с результатом их выполнения.

Подробнее

Достаточно интересный и опасный механизм. Во избежании проблем, которые могут возникнуть я добавил настройку, которая позволяет подтверждать выполнение функции и просмотреть параметры, с которыми будет вызвана функция.

Функции можно подключать в качестве динамической библиотеки, которая экспортирует функцию gptfunctions, которая в свою очередь возвращает массив объектов, которые представляют функции - объекты типа IChatFunctionExternal.

function gptfunctions: TArray<IChatFunctionExternal>;
begin
  Result := [TChatFunctionCMD.Create];
end;
  IChatFunctionExternal = interface
    ['{B2DACD74-B773-44C2-838D-43BF99CB5405}']
    function GetDescription: WideString;                  //Example: 'Get the current weather in a given location'
    function GetName: WideString;                         //Example: 'get_current_weather'
    function GetParameters: WideString;                   //JSON Scheme
    function Execute(const Args: WideString): WideString; //Args - json with params, result - json with info
  end;

GPT без проблем может вывести список файлов и даже показать содержимое (с кириллицей я пока не разобрался).

Total votes 2: ↑2 and ↓0+2
Comments0

Исследовал тут проблему завершения программы при завершении сессии винды в FMX.
При таком сценарии происходит утечка памяти, т.к. Application не освобождается при завершении программы.
Проблема это не большая и ни на что не влияет. Но, помимо этого тут затронут момент сохранения пользовательских данных при завершении программы.
Как вы могли заметить, если программа убивается, например, Андроидом, когда он решил, что она давно не используется, то событий закрытия или уничтожения формы не происходит.

Я нашёл интересное событие у формы, но в первую очередь, я увидел, что в FMX, в отличии от VCL, по умолчанию обрабатывается событие WM_ENDSESSION и WM_QUERYENDSESSION, которые мы обычно в VCL обрабатывали вручную у формы через message. Так вот, WM_QUERYENDSESSION по-умолчанию разрешает завершение программы, а вот WM_ENDSESSION, который происходит после этого события генерирует событие у формы под названием OnSaveState.

Так что, я рекомендую все сохранения настроек или других данных пихать именно туда.

Модуль FMX.Platform.Win.pas
Модуль FMX.Platform.Win.pas

О самой проблеме с утечкой. Её я тоже решил. Косяк в том, что при WM_ENDSESSION происходит завершение программы изнутри процедуры обработки сообщений, что в свою очередь приводит к задержанию в памяти Application.
Всему виной строка Halt (3-я снизу).

Решается это просто, если взять на себя модуль FMX.Platform.Win.pas и изменить немного этот код. Нужно Halt вызвать через очередь сообщений.

Application.Terminate;
TThread.ForceQueue(nil,
procedure
begin
Halt;
end);

Total votes 9: ↑9 and ↓0+9
Comments1

Модифицировал штатный Memo (FMX) для добавления возможности форматирования текста. А также, ускорил его работу в разных аспектах (прокрутка, выделение, вставка строк и т.д.) Актуально для Delphi 11.3 (на более ранних, скорее всего, работать не будет, т.к. внесены изменения в штатный модуль FMX.Memo.Style.pas, который может быть несовместим между версиями. Модуль находится рядом с проектом).

Пример с работой в 40к+ строк
Пример с работой в 40к+ строк

https://github.com/HemulGM/FMXRichMemo

Total votes 4: ↑4 and ↓0+4
Comments0

Information

Rating
3,328-th
Location
Екатеринбург, Свердловская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Fullstack Developer
Senior
From 180,000 ₽
Delphi
SQL
Database
Git
REST
C#
Python
OOP
MySQL
PHP