Spezi Chat

Build and Test codecov DOI

提供用于构建基于聊天应用程序的 UI 组件。

概述

SpeziChat 模块提供了可用于实现基于聊天用例的视图,例如消息视图或语音输入字段。

Screenshot displaying the regular chat view. Screenshot displaying the regular chat view. Screenshot displaying the text input chat view. Screenshot displaying the text input chat view. Screenshot displaying the voice input chat view. Screenshot displaying the voice input chat view.
ChatView ChatView ChatView

设置

1. 添加 Spezi Chat 作为依赖项

您需要将 Spezi Chat Swift 包添加到 Xcode 中的应用Swift 包中。

重要提示

如果您的应用程序尚未配置为使用 Spezi,请按照 Spezi 设置文章 来设置核心 Spezi 基础设施。

2. 配置目标属性

由于 SpeziChat 在底层使用了 SpeziSpeech 模块来实现语音交互功能,因此需要确保您的应用程序具有麦克风访问和语音识别的必要权限。 请按照以下步骤在您的 Xcode 项目中配置目标属性

这些条目对于使用麦克风和语音识别功能的应用程序是强制性的。 如果未能提供它们,将导致您的应用程序无法访问这些功能。

使用方法

SpeziChat 的底层数据模型是 Chat。 它表示用户和系统之间典型的基于文本的聊天内容。Chat 只是一个有序的 ChatEntity 数组,其中包含各个消息的内容。 ChatEntity 由一个 ChatEntity/Role、一个唯一标识符、一个时间戳以及一个基于 String 的内容组成,该内容可以包含 Markdown 格式的文本。 此外,一个标志指示 ChatEntity 是否完整,是否不会添加更多内容。

注意

ChatEntity 能够存储基于 Markdown 的内容,该内容又在 ChatViewMessagesViewMessageView 中呈现为样式文本。

聊天视图

ChatView 提供了一个基本的、可重用的聊天视图,其中包括一个消息输入字段。 可以通过 iOS 键盘输入,也可以通过语音输入并转录为书面文本。 它接受一个额外的 messagePendingAnimation 参数来控制是否为当前正在编写的消息显示聊天气泡动画。 默认情况下,messagePendingAnimation 的值为 nil 并且不显示。 此外,ChatView 提供了通过共享表单(或活动视图)将可视化的 Chat 导出为 PDF 文档、JSON 表示或文本 UTF-8 文件(参见 ChatView/ChatExportFormat)的功能。

struct ChatTestView: View {
    @State private var chat: Chat = [
        ChatEntity(role: .assistant, content: "Assistant Message!")
    ]


    var body: some View {
        ChatView($chat, exportFormat: .pdf)
            .navigationTitle("SpeziChat")
    }
}

注意

ChatView 通过 SpeziSpeech 模块开箱即用地提供了语音转文本(识别)以及文本转语音(合成)的辅助功能,从而促进与 ChatView 内容的无缝交互。

消息视图

MessagesView 以典型的聊天方式显示一个 Chat,其中包含多个具有不同 ChatEntity/RoleChatEntityView 会自动向下滚动到添加到传入的 Chat SwiftUI Binding 的最新消息。 typingIndicator 参数控制何时在屏幕上显示传入 Chat 的键入指示器。

struct MessagesViewTestView: View {
    @State private var chat: Chat = [
        ChatEntity(role: .user, content: "User Message!"),
        ChatEntity(role: .assistant, content: "Assistant Message!")
    ]


    var body: some View {
        MessagesView($chat)
    }
}

消息视图

MessageView 是一个可重用的 SwiftUI View,用于在典型的聊天消息气泡中显示 ChatEntity 的内容。 此气泡根据关联的 ChatEntity/Role 正确对齐。

struct MessageViewTestView: View {
    var body: some View {
        VStack {
            MessageView(ChatEntity(role: .user, content: "User Message!"))
            MessageView(ChatEntity(role: .assistant, content: "Assistant Message!"))
            MessageView(ChatEntity(role: .hidden(type: .unknown), content: "System Message (hidden)!"))
        }
            .padding()
    }
}

MessageInput View

MessageInputView 是一个可重用的 SwiftUI View,用于处理基于文本或基于语音的用户输入。 提供的消息通过 SwiftUI Binding 附加到传入的 Chat

struct MessageInputTestView: View {
    @State private var chat: Chat = []
    @State private var disableInput = false
    
    
    var body: some View {
        VStack {
            Spacer()
            MessageInputView($chat, messagePlaceholder: "TestMessage")
                .disabled(disableInput)
                /// Get the height of the `MessageInputView` via a SwiftUI `PreferenceKey`
                .onPreferenceChange(MessageInputViewHeightKey.self) { newValue in
                    let messageInputHeight: CGFloat = newValue
                    // ...
                }
        }
    }
}

有关更多信息,请参阅 API 文档

使用 Spezi Chat 的应用程序

HealthGPTLLMonFHIR 提供了使用 SpeziChat 模块的绝佳起点和示例。

贡献

欢迎为本项目做出贡献。 请务必先阅读贡献指南贡献者盟约行为准则

许可证

本项目基于 MIT 许可证。 有关更多信息,请参阅许可证

Spezi Footer Spezi Footer