Обсуждение проблем использования локальных LLM (псевдо ИИ)

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Аватара пользователя
Alexander
энтузиаст
Сообщения: 902
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Народ кто нибудь пробовать эту поделку ?
Новейшим FPC из GIT (релизный не пройдёт):

Код: Выделить всё

./ppcx64 -Rintel -FU./UNITS/ -Fu./src/synapse/ -Fu./src/ -Fu./externals/pinja/* -Fu./externals/pasmp/* -Fu./externals/pasjson/* -Fu./externals/pasdblstrutils/* -O3 src/pasllmcli/pasllmcli.dpr
Затем:

Код: Выделить всё

./bin/pasllmcli -model=bin/models/qwen3_8b_q40nl.safetensors 
User: привет! что ты умеешь?
Assistant:  .<think>
Okay, the user greeted me with "привет! что ты умеешь?" which means "Hello! What are you capable of?" I need to respond in Russian.

First, I should acknowledge their greeting and then list my capabilities. Let me recall the main functions: answering questions, writing stories, creating code, translating, and more. I should mention that I can assist with various tasks and ask how I can help them specifically.

Make sure the response is friendly and open-ended. Also, check for any typos and ensure the language is natural. Let me structure it step by step to cover all key points without being too verbose.
</think>

Привет! 😊 Я — Qwen, и у меня есть множество возможностей:  
- Отвечать на вопросы и помогать с разными задачами  
- Писать тексты, рассказы, сценарии и т.д.  
- Создавать код на различных языках программирования  
- Переводить тексты между языками  
- Анализировать данные и генерировать идеи  
- И многое другое!  

Как я могу вам помочь? 🌟
User: напиши программу на Паскале, которая выводит числа от 1 до 10
Assistant:  .

Привет! Вот пример программы на языке Паскаль, которая выводит числа от 1 до 10:

```pascal
program NumbersFrom1To10;

begin
  writeln(1);
  writeln(2);
  writeln(3);
  writeln(4);
  writeln(5);
  writeln(6);
  writeln(7);
  writeln(8);
  writeln(9);
  writeln(10);
end.
```

Если хочешь, я могу предложить более оптимальный вариант с использованием цикла!

Alex2013
долгожитель
Сообщения: 3340
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Здорово ! Но где модель брать ?
(Тут какая то куча файлов https://huggingface.co/Qwen/Qwen3-8B-Base/tree/main )
Аватара пользователя
Alexander
энтузиаст
Сообщения: 902
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Из README.md https://mega.nz/folder/krcgHCpZ#0tjLqup_Hc4THWC9itDrTg там директория models. В ней готовые преобразованные модели. Скачивать удалось только FireFox'ом. Если модель больше некоторого размера её и FireFox'ом не удастся скачать, только приложением Меги, которое она при этом предлагает (я не пробовал). Ну а про Hugging Face модели в README.md тоже что-то написано как их преобразовывать, но это я тоже ещё не пробовал.
Alex2013
долгожитель
Сообщения: 3340
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Alexander писал(а): 01.09.2026 19:39:48 Из README.md https://mega.nz/folder/krcgHCpZ#0tjLqup_Hc4THWC9itDrTg там директория models. В ней готовые преобразованные модели. Скачивать удалось только FireFox'ом. Если модель больше некоторого размера её и FireFox'ом не удастся скачать, только приложением Меги, которое она при этом предлагает (я не пробовал). Ну а про Hugging Face модели в README.md тоже что-то написано как их преобразовывать, но это я тоже ещё не пробовал.
Спасибо! (Извиняюсь проглядел)
Alex2013
долгожитель
Сообщения: 3340
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Работает однако !
pasllmcli.exe -model=qwen3_8b_q40nl.safetensors
User: Привет! Чем эта модель отличается от других?
Assistant: .<think>
...
</think>
Привет!
Эта модель (Qwen) отличается от других моделей несколькими ключевыми особенностями:

1. **Многоязычность**
Поддерживает более 100 языков, включая редкие и менее распространённые, что делает её универсальной для работы с текстами на разных языках.

2. **Большой объем знаний**
Обучена на огромном объеме текстов (до 2024 года), что позволяет ей отвечать на сложные вопросы, генерировать тексты высокого качества и понимать контекст в широком спектре тем.

3. **Гибкость и масштабируемость**
Доступна в разных версиях (например, Qwen, Qwen2, Qwen3, Qwen-Max), которые адаптированы под разные задачи: от простых запросов до сложных аналитических задач.

4. **Технические преимущества**
Использует передовые методы обработки естественного языка (NLP) и оптимизирована для работы в различных средах - от мобильных устройств до серверов.

5. **Этичность и безопасность**
Встроенные механизмы фильтрации и соблюдение правил этики, чтобы обеспечить безопасность и уважение к пользователям.

Если у тебя есть конкретные задачи или вопросы, я с радостью помогу! ??
Медленно правда (1-2 токена в секунду). (Непонятно GPU используется или нет )
Зы
Код пишет слегка лениво но довольно "кудряво" (впрочем какой вопрос такой ответ )

Примерный "движок новостей" NewsAPI

Код: Выделить всё

procedure TForm1.FetchNews(topic: string);                                                                       
var                                                                                                              
  HTTP: TIdHTTP;                                                                                                 
  XML: TXMLDocument;                                                                                             
  Node, ItemNode: IXMLNode;                                                                                      
  i: Integer;                                                                                                    
begin                                                                                                            
  HTTP := TIdHTTP.Create(nil);                                                                                   
  try                                                                                                            
    // Замените на URL RSS-фидов, соответствующих теме                                                           
    // Пример: https://newsrss2.feedburner.com/rss.xml (для новостей)                                            
    HTTP.Get('https://newsrss2.feedburner.com/rss.xml', XML);                                                    
  finally                                                                                                        
    HTTP.Free;                                                                                                   
  end;                                                                                                           
                                                                                                                 
  XML := TXMLDocument.Create(nil);                                                                               
  XML.XML := HTTP.Response.Content;                                                                              
                                                                                                                 
  for i := 0 to XML.ActiveNode.ChildNodes.Count - 1 do                                                           
  begin                                                                                                          
    Node := XML.ActiveNode.ChildNodes[i];                                                                        
    if Node.NodeName = 'item' then                                                                               
    begin                                                                                                        
      ItemNode := Node;                                                                                          
      if Pos(topic, ItemNode.ChildNodes[0].Text) > 0 then // Фильтрация по теме                                  
      begin                                                                                                      
        Memo1.Lines.Add(Format('Title: %s' + #13#10 + 'Link: %s' + #13#10, [                                     
          ItemNode.ChildNodes[0].Text, ItemNode.ChildNodes[1].Text                                               
        ]));                                                                                                     
      end;                                                                                                       
    end;                                                                                                         
  end;                                                                                                           
end;                                                                                                            
 
Alex2013
долгожитель
Сообщения: 3340
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Мда сборка свежего FPC c gits тот еще квест ... (зато какая ностальгия по линуксу, однако ! :wink: )
Умучился с попытками собрать через "автономный батник"
build_fpc_u3_с.bat (требует псевдо линукс MSYS2 https://www.msys2.org/)

Код: Выделить всё

@echo off
setlocal enabledelayedexpansion

:: --- НАСТРОЙКИ ---
Set PATH=%PATH%;..\SD\system\git\bin\;..\lazarus_64\fpc\3.2.2\bin\x86_64-win64\;

set FPC_INSTALL_DIR=%~dp0FPC_Main
set FPC_SOURCE_DIR=%~dp0fpcsrc
set FPC_BRANCH=main
set REPO_URL=https://gitlab.com/freepascal.org/fpc/source.git

:: Путь к MSYS2
set MSYS2_DIR=C:\msys64
set MSYS2_BASH=%MSYS2_DIR%\usr\bin\bash.exe

:: --- 1. ПРОВЕРКА НАЛИЧИЯ GIT ---
where git >nul 2>nul
if %errorlevel% neq 0 (
    echo ОШИБКА: Git не найден.
    pause
    exit /b 1
)

:: --- 2. ПРОВЕРКА MSYS2 ---
if not exist "%MSYS2_BASH%" (
    echo ОШИБКА: MSYS2 не найден в %MSYS2_DIR%
    pause
    exit /b 1
)

:: --- 3. КЛОНИРОВАНИЕ ---
echo.
echo ==========================================
echo Работа с репозиторием FPC
echo ==========================================

if exist "%FPC_SOURCE_DIR%\.git" (
    cd /d "%FPC_SOURCE_DIR%"
    git fetch --all --prune
    git checkout "%FPC_BRANCH%"
    git pull origin "%FPC_BRANCH%"
) else (
    git clone --depth 1 --branch "%FPC_BRANCH%" "%REPO_URL%" "%FPC_SOURCE_DIR%"
    cd /d "%FPC_SOURCE_DIR%"
)

:: --- 4. ПОИСК СТАРТОВОГО КОМПИЛЯТОРА ---
echo.
echo ==========================================
echo Поиск стартового компилятора
echo ==========================================

set FPC_BOOTSTRAP=
where fpc >nul 2>nul
if !errorlevel! equ 0 (
    for /f "delims=" %%i in ('where fpc') do set FPC_BOOTSTRAP=%%i
    echo Найден: !FPC_BOOTSTRAP!
    goto :found_bootstrap
)

if exist "C:\lazarus_64\fpc\3.2.2\bin\x86_64-win64\fpc.exe" (
    set FPC_BOOTSTRAP=C:\lazarus_64\fpc\3.2.2\bin\x86_64-win64\fpc.exe
    goto :found_bootstrap
)

echo ОШИБКА: Стартовый компилятор не найден.
pause
exit /b 1

:found_bootstrap

:: --- 5. ПОДГОТОВКА ---
echo.
echo ==========================================
echo Компиляция FPC
echo ==========================================
echo Версия: %FPC_BRANCH%
echo Целевая папка: %FPC_INSTALL_DIR%
echo.

if exist "%FPC_INSTALL_DIR%" rmdir /s /q "%FPC_INSTALL_DIR%"
mkdir "%FPC_INSTALL_DIR%"

:: Создаем простой bash-скрипт
set TEMP_SCRIPT=%TEMP%\build_fpc.sh

(
echo #!/bin/bash
echo export PATH="/usr/bin:/bin:$PATH"
echo cd "%FPC_SOURCE_DIR%" || exit 1
echo echo "=== Building FPC with Windows paths ==="
echo echo "Source dir: %FPC_SOURCE_DIR%"
echo echo "Install dir: %FPC_INSTALL_DIR%"
echo echo "Bootstrap: %FPC_BOOTSTRAP%"
echo 
echo # Используем Windows-формат путей
echo make clean all install ^
echo   FPC="%FPC_BOOTSTRAP%" ^
echo   PREFIX="%FPC_INSTALL_DIR%" ^
echo   OPT="-FD%MSYS2_DIR%\usr\bin" ^
echo   NOGDB=1 ^
echo   FPCMAKE="%FPC_SOURCE_DIR%\utils\fpcmake.exe"
echo 
echo echo "=== Build finished ==="
) > "%TEMP_SCRIPT%"

:: Запускаем
"%MSYS2_BASH%" --login -c "bash '%TEMP_SCRIPT%'"

if !errorlevel! neq 0 (
    echo.
    echo ОШИБКА: Сборка не удалась.
    pause
    exit /b 1
)

:: --- 6. СОЗДАНИЕ fpc.cfg ---
set FPC_BIN_DIR=%FPC_INSTALL_DIR%\bin\x86_64-win64
if exist "%FPC_BIN_DIR%\fpcmkcfg.exe" (
    "%FPC_BIN_DIR%\fpcmkcfg" -d basepath="%FPC_INSTALL_DIR%" -o "%FPC_BIN_DIR%\fpc.cfg"
)

echo.
echo ==========================================
echo СБОРКА ЗАВЕРШЕНА!
echo ==========================================
echo Компилятор: %FPC_BIN_DIR%
"%FPC_BIN_DIR%\fpc.exe" -iW 2>nul
echo.
pause
Но старый добрый fpcupdeluxe все же помог собрать "минимально годный " для этой поделки FPC 3.3.1
(Бенджамин "Кеноби" BeRo1985 в своем репертуаре "только транки только хардкор!" Тоже мне "Джедай из Шира" выискался... )
Зы
Собрал свой "правильный" 64-битный экземпляр скорости не прибавилось за то размер exe-шника просел до 1.4 мб

Код: Выделить всё

>my_pasllmcli.exe -model=u:\!\LLM\qwen3_8b_q40nl.safetensors (Привет! Можешь помочь в написании  простого движка получения и обновления новостей на заданные темы  из интернет в Lazarus ?)
Assistant:
<think>
Хорошо, пользователь хочет создать простой движок для получения и обновления новостей по заданным темам в Lazarus. Начну с того, что Lazarus - это среда разработки для Delphi, так что нужно использовать Delphi-подобный язык, вероятно, Object Pascal.
Первым делом, нужно понять, как получить данные с интернета. В Delphi обычно используются TIdHTTP из Indy, чтобы делать HTTP-запросы. Надо убедиться, что в проекте есть Indy. Если нет, то нужно добавить компоненты Indy в проект.
Далее, как получить новости по теме. Наверное, нужно сделать запрос к API новостных сайтов, например, NewsAPI или Google News. Но пользователь, возможно, хочет просто парсить HTML с веб-страницы. Нужно уточнить, но, возможно, стоит предложить оба варианта: через API и парсинг.
Если парсить HTML, то потребуется THTMLDocument или TChromium для отображения и парсинга. Но TChromium может быть сложным. Альтернатива - использовать TIdHTTP для получения HTML и затем парсить его с помощью регулярных выражений или XML-парсера, если страница в XML.
Но парсинг HTML с помощью регулярных выражений может быть ненадежным. Возможно, лучше использовать TXMLDocument и XPath, если сайт предоставляет данные в XML. Но если нет, то придется парсить HTML вручную.
Нужно также учесть обновление новостей. Возможно, использовать таймер, который каждые X минут запускает обновление. В Lazarus это можно сделать через TTimer.
Также нужно обработать ошибки: проверка статуса ответа, обработка исключений, логирование.
Пользователь, возможно, хочет сохранить новости в файл или базу данных. Нужно предусмотреть сохранение данных, например, в текстовый файл или SQLite базу.
Теперь структура проекта: форма с текстовыми полями для темы, кнопкой запуска, списком новостей, таймером для автоматического обновления.
Надо создать функцию, которая принимает тему и возвращает список новостей. Эта функция будет делать запрос, парсить и возвращать данные.
Проверить, как обрабатывать разные сайты. Например, для Google News нужно построить URL с параметром поиска по теме. Или использовать NewsAPI, но тогда нужно зарегистрировать API-ключ.
Возможно, пользователь не хочет использовать API, поэтому предложу вариант с парсингом HTML, но с оговоркой о сложностях и возможных изменениях в структуре страниц.
Также важно учесть, что парсинг может быть непростым, особенно если страница динамическая (например, с JavaScript). Тогда потребуется использовать TChromium, но это усложняет проект.
В итоге, предложу пример с TIdHTTP и парсингом HTML с помощью регулярных выражений или TXMLDocument, с комментарием о том, что для динамических страниц потребуется другой подход.
Нужно также добавить пример кода с комментариями, показать как получить HTML, найти заголовки и ссылки, и отобразить их в списке. Учесть обработку ошибок и примеры использования таймера.
Возможно, пользователь не знает, как настроить Indy, поэтому нужно упомянуть, что нужно добавить Indy в проект, установить соответствующие компоненты.
Также стоит предупредить о возможных ограничениях, например, частые запросы могут быть заблокированы сервером, поэтому нужно добавить задержку между запросами.
В итоге, структура ответа будет включать: описание подхода, пример кода с TIdHTTP и парсингом, использование TTimer, примеры обработки ошибок и сохранения данных. Также отметить возможные сложности и альтернативы.
</think>

Вот пример простого движка для получения и обновления новостей в Lazarus с использованием Indy (TIdHTTP) и парсинга HTML:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
Вот пример простого движка для получения и обновления новостей в Lazarus с использованием Indy (TIdHTTP) и парсинга HTML:                                                                   ### Важные замечания:                                                                                                                  ### Важные замечания:                                                                                                                  
                                                                                                                                                                                            1. Для работы с API (например, NewsAPI) нужно:                                                                                         1. Для работы с API (например, NewsAPI) нужно:                                                                                         
```pascal                                                                                                                                                                                      - Зарегистрироваться на сайте                                                                                                          - Зарегистрироваться на сайте                                                                                                       
unit NewsEngine;                                                                                                                                                                               - Получить API-ключ                                                                                                                    - Получить API-ключ                                                                                                                 
                                                                                                                                                                                               - Установить ограничения на частоту запросов                                                                                           - Установить ограничения на частоту запросов                                                                                        
interface                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                            2. Для парсинга HTML лучше использовать:                                                                                               2. Для парсинга HTML лучше использовать:                                                                                               
uses                                                                                                                                                                                           - TXMLDocument + XPath                                                                                                                 - TXMLDocument + XPath                                                                                                              
  SysUtils, Classes, IdHTTP, IdSSL, IdSSLOpenSSL, IdGlobal, Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls;                                                                                             - TChromium (для динамических сайтов)                                                                                                  - TChromium (для динамических сайтов)                                                                                               
                                                                                                                                                                                               - Или библиотеку как Tidy для парсинга HTML                                                                                            - Или библиотеку как Tidy для парсинга HTML                                                                                         
type                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  TNewsEngine = class                                                                                                                                                                       3. Для более надежного парсинга можно использовать:                                                                                    3. Для более надежного парсинга можно использовать:                                                                                    
  private                                                                                                                                                                                   ```pascal                                                                                                                              ```pascal                                                                                                                              
    FHTTP: TIdHTTP;                                                                                                                                                                         uses                                                                                                                                   uses                                                                                                                                   
    FSSL: TIdSSLIOHandlerSocketOpenSSL;                                                                                                                                                       Xml.XMLDoc, Xml.XMLIntf, Xml.XMLUTF8;                                                                                                  Xml.XMLDoc, Xml.XMLIntf, Xml.XMLUTF8;                                                                                                
    FTimer: TTimer;                                                                                                                                                                                                                                                                                                                                                                                                                                                       
    FNewsList: TStringList;                                                                                                                                                                 procedure ParseHTML(const HTML: string);                                                                                               procedure ParseHTML(const HTML: string);                                                                                               
    procedure UpdateNews;                                                                                                                                                                   var                                                                                                                                    var                                                                                                                                    
  public                                                                                                                                                                                      Doc: IXMLDocument;                                                                                                                     Doc: IXMLDocument;                                                                                                                   
    constructor Create;                                                                                                                                                                       Node: IXMLNode;                                                                                                                        Node: IXMLNode;                                                                                                                      
    destructor Destroy; override;                                                                                                                                                           begin                                                                                                                                  begin                                                                                                                                  
    procedure StartAutoUpdate(Interval: Integer);                                                                                                                                             Doc := LoadXMLDocument(UTF8ToSys(HTML, False));                                                                                        Doc := LoadXMLDocument(UTF8ToSys(HTML, False));                                                                                      
    procedure StopAutoUpdate;                                                                                                                                                                 for Node in Doc.DocumentElement.ChildNodes do                                                                                          for Node in Doc.DocumentElement.ChildNodes do                                                                                        
    procedure GetNewsByTopic(const Topic: string);                                                                                                                                            begin                                                                                                                                  begin                                                                                                                                
  end;                                                                                                                                                                                          if Node.NodeName = 'item' then                                                                                                         if Node.NodeName = 'item' then                                                                                                     
                                                                                                                                                                                                begin                                                                                                                                  begin                                                                                                                              
implementation                                                                                                                                                                                    Memo1.Lines.Add(Node.SelectSingleNode('title').Text);                                                                                  Memo1.Lines.Add(Node.SelectSingleNode('title').Text);                                                                            
                                                                                                                                                                                                  Memo1.Lines.Add(Node.SelectSingleNode('link').Text);                                                                                   Memo1.Lines.Add(Node.SelectSingleNode('link').Text);                                                                             
{ TNewsEngine }                                                                                                                                                                                   Memo1.Lines.Add('');                                                                                                                   Memo1.Lines.Add('');                                                                                                             
                                                                                                                                                                                                end;                                                                                                                                   end;                                                                                                                               
constructor TNewsEngine.Create;                                                                                                                                                               end;                                                                                                                                   end;                                                                                                                                 
begin                                                                                                                                                                                       end;                                                                                                                                   end;                                                                                                                                   
  inherited Create;                                                                                                                                                                         ```                                                                                                                                    ```                                                                                                                                    
  FHTTP := TIdHTTP.Create(nil);                                                                                                                                                                                                                                                                                                                                                                                                                                           
  FSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);                                                                                                                                         4. Добавьте обработку ошибок и ограничения на частоту запросов:                                                                        4. Добавьте обработку ошибок и ограничения на частоту запросов:                                                                        
  FHTTP.IOHandler := FSSL;                                                                                                                                                                  ```pascal                                                                                                                              ```pascal                                                                                                                              
  FNewsList := TStringList.Create;                                                                                                                                                          procedure TNewsEngine.GetNewsByTopic(const Topic: string);                                                                             procedure TNewsEngine.GetNewsByTopic(const Topic: string);                                                                             
  FTimer := TTimer.Create(nil);                                                                                                                                                             begin                                                                                                                                  begin                                                                                                                                  
  FTimer.OnTimer := UpdateNews;                                                                                                                                                               try                                                                                                                                    try                                                                                                                                  
end;                                                                                                                                                                                            FHTTP.Request.UserAgent := 'Mozilla/5.0';                                                                                              FHTTP.Request.UserAgent := 'Mozilla/5.0';                                                                                          
                                                                                                                                                                                                FHTTP.Request.ContentType := 'application/json';                                                                                       FHTTP.Request.ContentType := 'application/json';                                                                                   
destructor TNewsEngine.Destroy;                                                                                                                                                                 FHTTP.Get('https://example.com/news?topic=' + Topic);                                                                                  FHTTP.Get('https://example.com/news?topic=' + Topic);                                                                              
begin                                                                                                                                                                                         except                                                                                                                                 except                                                                                                                               
  FTimer.Free;                                                                                                                                                                                  on E: Exception do                                                                                                                     on E: Exception do                                                                                                                 
  FNewsList.Free;                                                                                                                                                                                 ShowMessage('Ошибка: ' + E.Message);                                                                                                   ShowMessage('Ошибка: ' + E.Message);                                                                                             
  FSSL.Free;                                                                                                                                                                                  end;                                                                                                                                   end;                                                                                                                                 
  FHTTP.Free;                                                                                                                                                                               end;                                                                                                                                   end;                                                                                                                                   
  inherited Destroy;                                                                                                                                                                        ```                                                                                                                                    ```                                                                                                                                    
end;                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                            Этот пример демонстрирует базовую структуру. Для полноценного решения потребуется:                                                     Этот пример демонстрирует базовую структуру. Для полноценного решения потребуется:                                                     
procedure TNewsEngine.UpdateNews;                                                                                                                                                           - Более надежный парсер                                                                                                                - Более надежный парсер                                                                                                                
begin                                                                                                                                                                                       - Обработка ошибок и ограничений                                                                                                       - Обработка ошибок и ограничений                                                                                                       
  GetNewsByTopic('technology'); // Замените на нужную тему                                                                                                                                  - Логирование и настройку параметров                                                                                                   - Логирование и настройку параметров                                                                                                   
end;                                                                                                                                                                                        - Возможность сохранения новостей в файл/базу данных                                                                                   - Возможность сохранения новостей в файл/базу данных                                                                                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
procedure TNewsEngine.StartAutoUpdate(Interval: Integer);                                                                                                                                   Если нужно, могу помочь адаптировать под конкретный источник новостей или добавить поддержку JSON/HTML парсинга.                       Если нужно, могу помочь адаптировать под конкретный источник новостей или добавить поддержку JSON/HTML парсинга.                       
begin                                                                                                                                                                                       
  FTimer.Interval := Interval;                                                                                                                                                              
  FTimer.Enabled := True;                                                                                                                                                                   
end;                                                                                                                                                                                        
                                                                                                                                                                                            
procedure TNewsEngine.StopAutoUpdate;                                                                                                                                                       
begin                                                                                                                                                                                       
  FTimer.Enabled := False;                                                                                                                                                                  
end;                                                                                                                                                                                        
                                                                                                                                                                                            
procedure TNewsEngine.GetNewsByTopic(const Topic: string);                                                                                                                                  
var                                                                                                                                                                                         
  Response: string;                                                                                                                                                                         
  i, PosStart, PosEnd: Integer;                                                                                                                                                             
begin                                                                                                                                                                                       
  try                                                                                                                                                                                       
    // Пример запроса к Google News API (нужен API-ключ)                                                                                                                                    
    // Замените 'YOUR_API_KEY' на ваш API ключ                                                                                                                                              
    Response := FHTTP.Get('https://newsapi.org/v2/top-headlines?category=technology&apiKey=YOUR_API_KEY');                                                                                  
                                                                                                                                                                                            
    // Парсинг JSON (пример)                                                                                                                                                                
    // В реальности нужно использовать TJSONParser или другой парсер                                                                                                                        
    // Для упрощения используем текстовый поиск                                                                                                                                             
    Response := StringReplace(Response, '}]', ']', False, [rfReplaceAll]);                                                                                                                  
    Response := StringReplace(Response, '}]', ']', False, [rfReplaceAll]);                                                                                                                  
                                                                                                                                                                                            
    // Имитация парсинга                                                                                                                                                                    
    FNewsList.Clear;                                                                                                                                                                        
    for i := 1 to 5 do                                                                                                                                                                      
    begin                                                                                                                                                                                   
      PosStart := Pos('title': ' + i * 100;                                                                                                                                                 
      PosEnd := Pos('}', PosStart);                                                                                                                                                         
      if PosStart > 0 then                                                                                                                                                                  
        FNewsList.Add(Copy(Response, PosStart + 7, PosEnd - PosStart - 7));                                                                                                                 
    end;                                                                                                                                                                                    
                                                                                                                                                                                            
    // Отобразить новости                                                                                                                                                                   
    ShowMessage('Новости: ' + FNewsList.Text);                                                                                                                                              
  except                                                                                                                                                                                    
    on E: Exception do                                                                                                                                                                      
      ShowMessage('Ошибка: ' + E.Message);                                                                                                                                                  
  end;                                                                                                                                                                                      
end;                                                                                                                                                                                        
                                                                                                                                                                                            
end.                                                                                                                                                                                        
```                                                                                                                                                                                         
                                                                                                                                                                                            
### Как использовать в Lazarus:                                                                                                                                                             
1. Добавьте в проект компоненты:                                                                                                                                                            
   - `TIdHTTP` и `TIdSSLIOHandlerSocketOpenSSL` из Indy                                                                                                                                     
   - `TTimer` из Vcl.ExtCtrls                                                                                                                                                               
                                                                                                                                                                                            
2. В форме добавьте:                                                                                                                                                                        
   - `TButton` для запуска получения новостей                                                                                                                                               
   - `TMemo` или `TListBox` для отображения новостей                                                                                                                                        
   - `TTimer` для автоматического обновления                                                                                                                                                
                                                                                                                                                                                            
3. Пример кода для формы:                                                                                                                                                                   
```pascal                                                                                                                                                                                   
procedure TForm1.Button1Click(Sender: TObject);                                                                                                                                             
begin                                                                                                                                                                                       
  NewsEngine1.GetNewsByTopic(Edit1.Text);                                                                                                                                                   
end;                                                                                                                                                                                        
                                                                                                                                                                                            
procedure TForm1.FormCreate(Sender: TObject);                                                                                                                                               
begin                                                                                                                                                                                       
  NewsEngine1 := TNewsEngine.Create;                                                                                                                                                        
  NewsEngine1.StartAutoUpdate(60000); // 60 секунд                                                                                                                                          
end;                                                                                                                                                                                        
                                                                                                                                                                                            
procedure TForm1.FormDestroy(Sender: TObject);                                                                                                                                              
begin                                                                                                                                                                                       
  NewsEngine1.Free;                                                                                                                                                                         
end;                                                                                                                                                                                        
```                                                                                                                                                                                         
                                                                                                                                                                                            
### Важные замечания:                                                                                                                                                                       
1. Для работы с API (например, NewsAPI) нужно:                                                                                                                                              
   - Зарегистрироваться на сайте                                                                                                                                                            
   - Получить API-ключ                                                                                                                                                                      
   - Установить ограничения на частоту запросов                                                                                                                                             
                                                                                                                                                                                            
2. Для парсинга HTML лучше использовать:                                                                                                                                                    
   - TXMLDocument + XPath                                                                                                                                                                   
   - TChromium (для динамических сайтов)                                                                                                                                                    
   - Или библиотеку как Tidy для парсинга HTML                                                                                                                                              
                                                                                                                                                                                            
3. Для более надежного парсинга можно использовать:                                                                                                                                         
```pascal                                                                                                                                                                                   
uses                                                                                                                                                                                        
  Xml.XMLDoc, Xml.XMLIntf, Xml.XMLUTF8;                                                                                                                                                     
                                                                                                                                                                                            
procedure ParseHTML(const HTML: string);                                                                                                                                                    
var                                                                                                                                                                                         
  Doc: IXMLDocument;                                                                                                                                                                        
  Node: IXMLNode;                                                                                                                                                                           
begin                                                                                                                                                                                       
  Doc := LoadXMLDocument(UTF8ToSys(HTML, False));                                                                                                                                           
  for Node in Doc.DocumentElement.ChildNodes do                                                                                                                                             
  begin                                                                                                                                                                                     
    if Node.NodeName = 'item' then                                                                                                                                                          
    begin                                                                                                                                                                                   
      Memo1.Lines.Add(Node.SelectSingleNode('title').Text);                                                                                                                                 
      Memo1.Lines.Add(Node.SelectSingleNode('link').Text);                                                                                                                                  
      Memo1.Lines.Add('');                                                                                                                                                                  
    end;                                                                                                                                                                                    
  end;                                                                                                                                                                                      
end;                                                                                                                                                                                        
```                                                                                                                                                                                         
                                                                                                                                                                                            
4. Добавьте обработку ошибок и ограничения на частоту запросов:                                                                                                                             
```pascal                                                                                                                                                                                   
procedure TNewsEngine.GetNewsByTopic(const Topic: string);                                                                                                                                  
begin                                                                                                                                                                                       
  try                                                                                                                                                                                       
    FHTTP.Request.UserAgent := 'Mozilla/5.0';                                                                                                                                               
    FHTTP.Request.ContentType := 'application/json';                                                                                                                                        
    FHTTP.Get('https://example.com/news?topic=' + Topic);                                                                                                                                   
  except                                                                                                                                                                                    
    on E: Exception do                                                                                                                                                                      
      ShowMessage('Ошибка: ' + E.Message);                                                                                                                                                  
  end;                                                                                                                                                                                      
end;                                                                                                                                                                                        
```                                                                                                                                                                                         
                                                                                                                                                                                            
Этот пример демонстрирует базовую структуру. Для полноценного решения потребуется:                                                                                                          
- Более надежный парсер                                                                                                                                                                     
- Обработка ошибок и ограничений                                                                                                                                                            
- Логирование и настройку параметров                                                                                                                                                        
- Возможность сохранения новостей в файл/базу данных                                                                                                                                        
                                                                                                                                                                                            
Если нужно, могу помочь адаптировать под конкретный источник новостей или добавить поддержку JSON/HTML парсинга.  
Ответить