Использование ИИ для тегирования и категоризации постов на форуме

Спасибо, Сэм,

Кому-то проще, кому-то сложнее. Я отношусь к последней категории :joy:

Я пытаюсь разобраться с этим, но у меня пока не получается. У меня нет опыта работы с инструментами, поэтому я с нетерпением жду, когда у меня всё заработает, чтобы подумать о других способах их использования.

Я пробовал использовать код из вашего блога с API-ключом, но это не сработало. ИИ предложил мне использовать жёстко заданный URL, я попробовал, но тоже без успеха.

API-ключ не вызывался, и не было создано никаких логов с ошибками.

Это используется для автоматической категоризации тем при создании

Я классифицирую тему «Уроки из ранних лет Иисуса и его чудеса» в категорию Новый Завет, так как она связана с жизнью и учением Иисуса.
Перемещаю тему сейчас…

Вот что я пробовал.

/**

  • Справочник по API инструментов
  • Входные функции
  • invoke(parameters): Основная функция. Принимает параметры (Объект). Должна возвращать значение, сериализуемое в JSON.
  • Пример:
  • function invoke(parameters) { return “result”; }
  • details(): Опционально. Возвращает строку с описанием инструмента.
  • Пример:
  • function details() { return “Описание инструмента.”; }
  • Предоставляемые объекты
    1. http
  • http.get(url, options?): Выполняет HTTP GET-запрос.
  • Параметры:
  •  url (string): URL запроса.
    
  •  options (Object, optional):
    
  •    headers (Object): Заголовки запроса.
    
  • Возвращает:
  •  { status: number, body: string }
    
  • http.post(url, options?): Выполняет HTTP POST-запрос.
  • Параметры:
  •  url (string): URL запроса.
    
  •  options (Object, optional):
    
  •    headers (Object): Заголовки запроса.
    
  •    body (string): Тело запроса.
    
  • Возвращает:
  •  { status: number, body: string }
    
  • (также доступны: http.put, http.patch, http.delete)
  • Примечание: Максимум 20 HTTP-запросов за одно выполнение.
    1. llm
  • llm.truncate(text, length): Обрезает текст до указанной длины в токенах.
  • Параметры:
  •  text (string): Текст для обрезки.
    
  •  length (number): Максимальное количество токенов.
    
  • Возвращает:
  •  Обрезанную строку.
    
    1. index
  • index.search(query, options?): Ищет в индексированных документах.
  • Параметры:
  •  query (string): Запрос поиска.
    
  •  options (Object, optional):
    
  •    filenames (Array): Ограничить поиск конкретными файлами.
    
  •    limit (number): Максимальное количество фрагментов (до 200).
    
  • Возвращает:
  •  Массив объектов { fragment: string, metadata: string }
    
    1. upload
  • upload.create(filename, base_64_content): Загружает файл.
  • Параметры:
  •  filename (string): Имя файла.
    
  •  base_64_content (string): Контент файла в кодировке Base64.
    
  • Возвращает:
  •  { id: number, short_url: string }
    
    1. chain
  • chain.setCustomRaw(raw): Устанавливает тело сообщения и завершает цепочку.
  • Параметры:
  •  raw (string): Сырой контент для добавления в сообщение.
    
  • Ограничения
  • Время выполнения: ≤ 2000 мс
  • Память: ≤ 10 МБ
  • HTTP-запросы: ≤ 20 за одно выполнение
  • Превышение ограничений приведёт к ошибкам или завершению работы.
  • Безопасность
  • Песочница: Нет доступа к системным или глобальным объектам.
  • Нет доступа к файловой системе: Нельзя читать или записывать файлы.
    */

/**

  • Категоризатор тем Discourse
  • Этот инструмент позволяет изменить категорию темы Discourse
  • с помощью API Discourse.
    */

/**

  • Категоризатор тем Discourse
  • Этот инструмент позволяет изменить категорию темы Discourse
  • с помощью API Discourse.
    */

/**

  • Категоризатор тем Discourse
  • Этот инструмент позволяет изменить категорию темы Discourse
  • с помощью API Discourse.
    */

function invoke(params) {
// Проверка обязательных параметров
if (!params.topic_id) {
return { error: “Отсутствует обязательный параметр: topic_id” };
}

if (!params.category_id) {
return { error: “Отсутствует обязательный параметр: category_id” };
}

// Базовый URL вашего экземпляра Discourse
const baseUrl = “https://community.mysite.com”;

// Полный URL API для обновления темы
const apiUrl = ${baseUrl}/t/${params.topic_id}.json;

// Подготовка тела запроса
const requestBody = {
category_id: params.category_id
};

// Опциональный параметр: обновить заголовок, если он указан
if (params.title) {
requestBody.title = params.title;
}

// Используйте ваш API-ключ
const apiKey = “Discourse-API-Key”;

try {
// Выполнение PUT-запроса для обновления темы
const response = http.put(apiUrl, {
headers: {
“Content-Type”: “application/json”,
“Api-Key”: apiKey,
“Api-Username”: params.api_username || “system”
},
body: JSON.stringify(requestBody)
});

if (response.status >= 200 && response.status < 300) {
  return {
    success: true,
    topic_id: params.topic_id,
    category_id: params.category_id,
    response: JSON.parse(response.body)
  };
} else {
  return {
    error: `Не удалось обновить категорию темы. Статус: ${response.status}`,
    details: response.body
  };
}

} catch (error) {
return {
error: “Произошла ошибка при обновлении категории темы”,
details: error.toString()
};
}
}

function details() {
return “Классифицирует тему, перемещая её в указанную категорию”;
}