Перейти к основному содержимому

AI-вопросы

Отправляйте текстовый вопрос выбранному поставщику AI-сервисов, связывайте callbacks с идентификатором вопроса и отображайте накопленный текст ответа либо его приращения.

Animated workflow

Жизненный цикл AI-вопроса

Идентификатор запроса может быть получен синхронно или через callback; затем поступают потоковые обновления ответа и один завершающий callback.

Приложение

Проверить вопрос

Удалить лишние пробелы и отклонить пустой запрос до его создания.

Приложение

Настроить агента

При необходимости выбрать идентификатор агента конкретного поставщика.

AI-сервис

Отправить вопрос

Вызвать AIBudsAISDK.send и сохранить синхронно возвращённый идентификатор.

Callback запуска

Начать ответ

Зафиксировать идентификатор вопроса, когда поставщик начинает отвечать.

AI-сервис → приложение

Получать ответ

Использовать fullText при наличии, иначе добавлять обновление deltaText.

приращение или полный текст
Итоговый результат

Завершить или обработать ошибку

Включить интерфейс и закрыть состояние запроса из завершающего callback.

Завершение определяют onFinishAnswering или onError; isFinal отмечает лишь последнее обновление текста.

Предварительные условия

  • Инициализируйте AIBudsAISDK, выберите зарегистрированного поставщика и при необходимости завершите авторизацию.
  • Убедитесь, что выбранный поставщик реализует AIAskingServiceAPI.
  • Выполняйте обновления интерфейса из callbacks в главной очереди.

Реализация с помощью AI

Разработка с AI

Реализуйте этот сценарий с AI

Используйте официальный навык «Реализация вопросов к ИИ AIBuds» и адаптируйте сценарий к приложению.

Прочитайте и выполните инструкции https://docs-aibuds.github.io/ru/skills/implement-aibuds-ai-asking. Используйте этот навык, чтобы реализовать «Реализация вопросов к ИИ AIBuds» в данном iOS-проекте и проверить результат.
Открыть официальный навык

API Reference

Framework

AIBudsAI.xcframework

Import

Swift
import AIBudsAI
import AIBudsAIFoundation

Declaration

Swift
/// Sends a text question to the currently selected AI service and receives
/// the answer as a stream of updates.
///
/// - Parameters:
///   - question: The question or prompt to send.
///   - config: Configuration for the request. Defaults to `.default`.
///   - onStartAnswering: Called when the service starts answering. The
///     question identifier may be `nil` if it has not yet been assigned.
///   - onAnswer: Called for each answer update.
///     - questionId: The identifier of the question being answered.
///     - deltaText: Newly generated text in this update, if available.
///     - fullText: The accumulated answer text, if available.
///     - isFinal: `true` when this is the final answer update.
///   - onFinishAnswering: Called when answering finishes successfully.
///   - onError: Called when validation fails or the provider reports an error.
/// - Returns: The question identifier when the request is created; otherwise `nil`.
public static func send(question: String,
                          config: AIAskingConfig = .default,
                onStartAnswering: ((_ questionId: String?) -> Void)? = nil,
                        onAnswer: ((
                            _ questionId: String,
                            _ deltaText: String?,
                            _ fullText: String?,
                            _ isFinal: Bool
                        ) -> Void)? = nil,
               onFinishAnswering: ((_ questionId: String) -> Void)? = nil,
                         onError: ((_ questionId: String, _ error: Error) -> Void)? = nil) -> String?

См. send и AIAskingConfig.

Конфигурация

AIAskingConfig.specifiedAgent необязателен и зависит от поставщика. Оставьте nil, чтобы использовать стандартный выбор агента. Идентификатор из Demo может быть недействителен для другой учётной записи или поставщика.

Примеры использования

Примеры соответствуют AIAskingDemoController: они принимают полный накопленный ответ или приращение, сохраняют последний непустой идентификатор вопроса и отделяют последнее обновление ответа от завершения запроса.

Swift
let question = input.trimmingCharacters(in: .whitespacesAndNewlines)
guard !question.isEmpty else { return }

let config = AIAskingConfig()
config.specifiedAgent = selectedAgentID

var activeQuestionID: String?
var answer = ""

let returnedID = AIBudsAISDK.send(
    question: question,
    config: config,
    onStartAnswering: { questionID in
        DispatchQueue.main.async {
            activeQuestionID = questionID ?? activeQuestionID
        }
    },
    onAnswer: { questionID, deltaText, fullText, isFinal in
        DispatchQueue.main.async {
            activeQuestionID = questionID
            if let fullText {
                answer = fullText
            } else if let deltaText {
                answer += deltaText
            }
            render(answer: answer, isFinalUpdate: isFinal)
        }
    },
    onFinishAnswering: { questionID in
        DispatchQueue.main.async {
            activeQuestionID = questionID
            setAsking(false)
        }
    },
    onError: { questionID, error in
        DispatchQueue.main.async {
            if !questionID.isEmpty { activeQuestionID = questionID }
            setAsking(false)
            show(error)
        }
    }
)

activeQuestionID = returnedID ?? activeQuestionID

Обработка ошибок

Если проверка завершается ошибкой до создания запроса, send может вернуть nil и синхронно вызвать onError. Идентификатор вопроса в callback ошибки при этом пуст. Пока запрос активен, блокируйте повторную отправку и восстанавливайте интерфейс из обоих завершающих callbacks.

Примечания

  • isFinal отмечает последнее потоковое обновление ответа; успешное завершение запроса определяйте по onFinishAnswering.
  • Поставщик может передать fullText, deltaText или оба значения. Предпочитайте fullText, чтобы не дублировать накопленный текст.
  • Публичный API сейчас не предоставляет метод отмены активного запроса.