У меня все настроено с использованием Gemini с моим проектом Swift iOS через расширения Firebase.
Однако FireStore извлекает все документы из коллекции Chat, независимо от пользователя.
Как добавить UserID в документ и получать и удалять документы только для этого конкретного пользователя?
Модель
@Observable class Model {
@Published var user: User? //user.uid
@Published var messages: [ChatMessage] = []
private var db = Firestore.firestore()
private let collectionPath = "generate"
func fetchMessages() {
db.collection(collectionPath)
.order(by: "createTime", descending: false)
.addSnapshotListener { [weak self] querySnapshot, error in
guard let self else { return }
guard let documents = querySnapshot?.documents else {
print("No documents found")
return
}
messages = documents.compactMap { snapshot -> [Chat]? in
do {
let document = try snapshot.data(as: ChatDocument.self)
let prompt = Chat(text: document.prompt, isUser: true, state: .COMPLETED)
let response = Chat(text: document.response ?? "", isUser: false, state: document.status.chatState)
return [prompt, response]
} catch {
print(error.localizedDescription)
return nil
}
}.flatMap { $0 }
}
}
func sendMessage(_ message: String) {
let placeholderMessages = [Chat(text: message, isUser: true, state: .COMPLETED), Chat(text: "", isUser: false)]
messages.append(contentsOf: placeholderMessages)
db.collection(collectionPath).addDocument(data: ["prompt": message])
}
//THIS DOES NOT DO ANYTHING
func removeAll() async {
for m in messages {
do {
try await db.collection("conversations").document(m.text).delete()
print("Document successfully removed!")
} catch {
print("Error removing document: \(error)")
}
}
}
}
Объект чата
struct ChatDocument: Codable {
let createTime: Timestamp
let prompt: String
let response: String?
let status: Status
struct Status: Codable {
let startTime: Timestamp?
let completeTime: Timestamp?
let updateTime: Timestamp
let state: String
let error: String?
var chatState: ChatState {
return ChatState(rawValue: state) ?? .PROCESSING
}
}
}
enum ChatState: String, Codable {
case COMPLETED
case ERROR
case PROCESSING
}
struct Chat: Hashable {
private(set) var id: UUID = .init()
var text: String?
var isUser: Bool
var state: ChatState = .PROCESSING
var message: String {
switch state {
case .COMPLETED:
return text ?? ""
case .ERROR:
return "Something went wrong. Please try again."
case .PROCESSING:
return "..."
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... -geminiapi
Добавьте UserID в ChatDocument для GeminiAPI ⇐ IOS
Программируем под IOS
-
Anonymous
1716118302
Anonymous
У меня все настроено с использованием Gemini с моим проектом Swift iOS через расширения Firebase.
Однако FireStore извлекает все документы из коллекции Chat, независимо от пользователя.
Как добавить UserID в документ и получать и удалять документы только для этого конкретного пользователя?
[b]Модель[/b]
@Observable class Model {
@Published var user: User? //user.uid
@Published var messages: [ChatMessage] = []
private var db = Firestore.firestore()
private let collectionPath = "generate"
func fetchMessages() {
db.collection(collectionPath)
.order(by: "createTime", descending: false)
.addSnapshotListener { [weak self] querySnapshot, error in
guard let self else { return }
guard let documents = querySnapshot?.documents else {
print("No documents found")
return
}
messages = documents.compactMap { snapshot -> [Chat]? in
do {
let document = try snapshot.data(as: ChatDocument.self)
let prompt = Chat(text: document.prompt, isUser: true, state: .COMPLETED)
let response = Chat(text: document.response ?? "", isUser: false, state: document.status.chatState)
return [prompt, response]
} catch {
print(error.localizedDescription)
return nil
}
}.flatMap { $0 }
}
}
func sendMessage(_ message: String) {
let placeholderMessages = [Chat(text: message, isUser: true, state: .COMPLETED), Chat(text: "", isUser: false)]
messages.append(contentsOf: placeholderMessages)
db.collection(collectionPath).addDocument(data: ["prompt": message])
}
//THIS DOES NOT DO ANYTHING
func removeAll() async {
for m in messages {
do {
try await db.collection("conversations").document(m.text).delete()
print("Document successfully removed!")
} catch {
print("Error removing document: \(error)")
}
}
}
}
[b]Объект чата[/b]
struct ChatDocument: Codable {
let createTime: Timestamp
let prompt: String
let response: String?
let status: Status
struct Status: Codable {
let startTime: Timestamp?
let completeTime: Timestamp?
let updateTime: Timestamp
let state: String
let error: String?
var chatState: ChatState {
return ChatState(rawValue: state) ?? .PROCESSING
}
}
}
enum ChatState: String, Codable {
case COMPLETED
case ERROR
case PROCESSING
}
struct Chat: Hashable {
private(set) var id: UUID = .init()
var text: String?
var isUser: Bool
var state: ChatState = .PROCESSING
var message: String {
switch state {
case .COMPLETED:
return text ?? ""
case .ERROR:
return "Something went wrong. Please try again."
case .PROCESSING:
return "..."
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78502430/add-userid-to-chatdocument-for-geminiapi[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия