Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: MIT
*/

package com.owncloud.android.lib.resources.assistant

import kotlinx.serialization.json.Json

internal val assistantRequestJson =
Json {
encodeDefaults = true
explicitNulls = false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: MIT
*/

package com.owncloud.android.lib.resources.assistant

import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonTransformingSerializer

internal open class EmptyArrayAsObjectSerializer<T : Any>(
serializer: KSerializer<T>
) : JsonTransformingSerializer<T>(serializer) {
override fun transformDeserialize(element: JsonElement): JsonElement =
if (element is JsonArray && element.isEmpty()) JsonObject(emptyMap()) else element
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.nextcloud.operations.GetMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessage
import org.apache.commons.httpclient.HttpStatus

Expand All @@ -31,7 +32,7 @@ class CheckGenerationRemoteOperation(
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = getMethod.getResponseBodyAsString()
val jsonResponse = gson.fromJson(responseBody, ChatMessage::class.java)
val jsonResponse = ocsJson.decodeFromString<ChatMessage>(responseBody)

val result = RemoteOperationResult<ChatMessage>(true, getMethod)
result.resultData = jsonResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.nextcloud.operations.GetMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.Session
import org.apache.commons.httpclient.HttpStatus

Expand All @@ -31,7 +32,7 @@ class CheckSessionRemoteOperation(
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = getMethod.getResponseBodyAsString()
val jsonResponse = gson.fromJson(responseBody, Session::class.java)
val jsonResponse = ocsJson.decodeFromString<Session>(responseBody)

val result = RemoteOperationResult<Session>(true, getMethod)
result.resultData = jsonResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@

package com.owncloud.android.lib.resources.assistant.chat

import com.google.gson.reflect.TypeToken
import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.PutMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.CreateConversation
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
import org.apache.commons.httpclient.HttpStatus
Expand All @@ -25,13 +27,11 @@ class CreateConversationRemoteOperation(
) : RemoteOperation<CreateConversation>() {
@Suppress("TooGenericExceptionCaught")
override fun run(client: NextcloudClient): RemoteOperationResult<CreateConversation> {
val bodyMap =
hashMapOf(
"title" to title,
"timestamp" to timestamp
)

val json = gson.toJson(bodyMap)
val json =
buildJsonObject {
title?.let { put("title", it) }
put("timestamp", timestamp)
}.toString()
val requestBody = json.toRequestBody("application/json".toMediaTypeOrNull())

val putMethod = PutMethod(client.baseUri.toString() + "$BASE_URL/new_session", true, requestBody)
Expand All @@ -40,8 +40,7 @@ class CreateConversationRemoteOperation(
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = putMethod.getResponseBodyAsString()
val type = object : TypeToken<CreateConversation>() {}.type
val response: CreateConversation = gson.fromJson(responseBody, type)
val response = ocsJson.decodeFromString<CreateConversation>(responseBody)
val result: RemoteOperationResult<CreateConversation> = RemoteOperationResult(true, putMethod)
result.resultData = response
result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@

package com.owncloud.android.lib.resources.assistant.chat

import com.google.gson.reflect.TypeToken
import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.PutMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessage
import com.owncloud.android.lib.resources.assistant.assistantRequestJson
import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessageRequest
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
Expand All @@ -25,7 +26,7 @@ class CreateMessageRemoteOperation(
) : RemoteOperation<ChatMessage>() {
@Suppress("TooGenericExceptionCaught")
override fun run(client: NextcloudClient): RemoteOperationResult<ChatMessage> {
val json = gson.toJson(messageRequest.bodyMap)
val json = assistantRequestJson.encodeToString(messageRequest)
val requestBody = json.toRequestBody("application/json".toMediaTypeOrNull())

val putMethod = PutMethod(client.baseUri.toString() + "$BASE_URL/new_message", true, requestBody)
Expand All @@ -34,8 +35,7 @@ class CreateMessageRemoteOperation(
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = putMethod.getResponseBodyAsString()
val type = object : TypeToken<ChatMessage>() {}.type
val response: ChatMessage = gson.fromJson(responseBody, type)
val response = ocsJson.decodeFromString<ChatMessage>(responseBody)
val result: RemoteOperationResult<ChatMessage> = RemoteOperationResult(true, putMethod)
result.resultData = response
result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.nextcloud.operations.GetMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.SessionTask
import org.apache.commons.httpclient.HttpStatus

Expand All @@ -28,7 +29,7 @@ class GenerateSessionRemoteOperation(
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = getMethod.getResponseBodyAsString()
val jsonResponse = gson.fromJson(responseBody, SessionTask::class.java)
val jsonResponse = ocsJson.decodeFromString<SessionTask>(responseBody)

val result = RemoteOperationResult<SessionTask>(true, getMethod)
result.resultData = jsonResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@

package com.owncloud.android.lib.resources.assistant.chat

import com.google.gson.reflect.TypeToken
import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.GetMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.Conversation
import org.apache.commons.httpclient.HttpStatus

Expand All @@ -26,8 +26,7 @@ class GetConversationListRemoteOperation : RemoteOperation<List<Conversation>>()
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = getMethod.getResponseBodyAsString()
val type = object : TypeToken<List<Conversation>>() {}.type
val conversationList: List<Conversation> = gson.fromJson(responseBody, type)
val conversationList = ocsJson.decodeFromString<List<Conversation>>(responseBody)

val result = RemoteOperationResult<List<Conversation>>(true, getMethod)
result.resultData = conversationList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@

package com.owncloud.android.lib.resources.assistant.chat

import com.google.gson.reflect.TypeToken
import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.GetMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.ocs.ocsJson
import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessage
import org.apache.commons.httpclient.HttpStatus

Expand All @@ -32,8 +32,7 @@ class GetMessagesRemoteOperation(
return try {
if (status == HttpStatus.SC_OK) {
val responseBody = getMethod.getResponseBodyAsString()
val type = object : TypeToken<List<ChatMessage>>() {}.type
val response: List<ChatMessage> = gson.fromJson(responseBody, type)
val response = ocsJson.decodeFromString<List<ChatMessage>>(responseBody)
val result: RemoteOperationResult<List<ChatMessage>> = RemoteOperationResult(true, getMethod)
result.resultData = response
result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,20 @@

package com.owncloud.android.lib.resources.assistant.chat.model

import com.google.gson.annotations.SerializedName
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement

@Serializable
data class ChatMessage(
val id: Long,
@SerializedName("session_id")
@SerialName("session_id")
val sessionId: Long,
val role: String,
val content: String,
val timestamp: Long,
@SerializedName("ocp_task_id")
val ocpTaskId: Any?,
val sources: String,
val attachments: List<Any?>
@SerialName("ocp_task_id")
val ocpTaskId: Long? = null,
val sources: String? = null,
val attachments: List<JsonElement> = emptyList()
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,14 @@

package com.owncloud.android.lib.resources.assistant.chat.model

import kotlinx.serialization.Serializable

@Serializable
data class ChatMessageRequest(
val sessionId: String,
val role: String,
val content: String,
val timestamp: Long,
val attachments: List<String>? = null,
val firstHumanMessage: Boolean = false
) {
val bodyMap =
hashMapOf(
"sessionId" to sessionId,
"role" to role,
"content" to content,
"timestamp" to timestamp,
"firstHumanMessage" to firstHumanMessage,
"attachments" to attachments
)
}
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,27 @@

package com.owncloud.android.lib.resources.assistant.chat.model

import com.google.gson.annotations.SerializedName
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Locale
import kotlin.time.ExperimentalTime
import kotlin.time.Instant
import kotlin.time.toJavaInstant

@Serializable
data class Conversation(
val id: Long,
@SerializedName("user_id")
@SerialName("user_id")
val userId: String,
val title: String?,
val title: String? = null,
val timestamp: Long,
@SerializedName("agency_conversation_token")
val agencyConversationToken: String,
@SerializedName("agency_pending_actions")
val agencyPendingActions: Any?
@SerialName("agency_conversation_token")
val agencyConversationToken: String? = null,
@SerialName("agency_pending_actions")
val agencyPendingActions: JsonElement? = null
) {
companion object {
private const val TITLE_PRESENTATION_TIME_PATTERN = "MMMM dd, yyyy HH:mm"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

package com.owncloud.android.lib.resources.assistant.chat.model

import kotlinx.serialization.Serializable

@Serializable
data class CreateConversation(
val session: Conversation
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,18 @@

package com.owncloud.android.lib.resources.assistant.chat.model

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement

@Serializable
data class Session(
val messageTaskId: Int?,
val titleTaskId: Int?,
val sessionTitle: String,
val sessionAgencyPendingActions: Any?,
val taskId: Long
val messageTaskId: Long? = null,
val titleTaskId: Long? = null,
val sessionTitle: String? = null,
val sessionAgencyPendingActions: JsonElement? = null
)

@Serializable
data class SessionTask(
val taskId: Long
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.PostMethod
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
import org.apache.commons.httpclient.HttpStatus
Expand All @@ -21,15 +23,13 @@ class CreateTaskRemoteOperationV1(
private val type: String
) : RemoteOperation<Void>() {
override fun run(client: NextcloudClient): RemoteOperationResult<Void> {
val requestBody =
hashMapOf(
"input" to input,
"type" to type,
"appId" to "assistant",
"identifier" to ""
)

val json = gson.toJson(requestBody)
val json =
buildJsonObject {
put("input", input)
put("type", type)
put("appId", "assistant")
put("identifier", "")
}.toString()

val request = json.toRequestBody("application/json".toMediaTypeOrNull())

Expand Down
Loading
Loading