Skip to content

Commit 16318fc

Browse files
authored
Stability AI provider (#153)
* Stability AI | Patch 1 * Stability AI | Patch 2 * Stability AI | Patch 3 * Stability AI | Patch 4 * Stability AI | Patch 5 * Resolve conflicts * Update translations
1 parent bb8226e commit 16318fc

File tree

91 files changed

+1518
-130
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+1518
-130
lines changed

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ android {
2222
buildConfigField "String", "HUGGING_FACE_INFERENCE_URL", "\"https://api-inference.huggingface.co/\""
2323
buildConfigField "String", "HORDE_AI_URL", "\"https://stablehorde.net/\""
2424
buildConfigField "String", "OPEN_AI_URL", "\"https://api.openai.com/\""
25+
buildConfigField "String", "STABILITY_AI_URL", "\"https://api.stability.ai/\""
2526

2627
buildConfigField "String", "HORDE_AI_SIGN_UP_URL", "\"https://stablehorde.net/register\""
2728
buildConfigField "String", "HUGGING_FACE_INFO_URL", "\"https://huggingface.co/docs/api-inference/index\""
2829
buildConfigField "String", "OPEN_AI_INFO_URL", "\"https://platform.openai.com/api-keys\""
30+
buildConfigField "String", "STABILITY_AI_INFO_URL", "\"https://platform.stability.ai/\""
2931
buildConfigField "String", "UPDATE_API_URL", "\"https://sdai.moroz.cc\""
3032
buildConfigField "String", "DEMO_MODE_API_URL", "\"https://sdai.moroz.cc\""
3133
buildConfigField "String", "POLICY_URL", "\"https://sdai.moroz.cc/policy.html\""

app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ val providersModule = module {
4444
override val huggingFaceApiUrl: String = BuildConfig.HUGGING_FACE_URL
4545
override val huggingFaceInferenceApiUrl = BuildConfig.HUGGING_FACE_INFERENCE_URL
4646
override val openAiApiUrl: String = BuildConfig.OPEN_AI_URL
47+
override val stabilityAiApiUrl = BuildConfig.STABILITY_AI_URL
4748
}
4849
}
4950

@@ -67,6 +68,11 @@ val providersModule = module {
6768
NetworkHeaders.AUTHORIZATION to key
6869
}
6970

71+
ServerSource.STABILITY_AI -> {
72+
val key = "${NetworkPrefixes.BEARER} ${preference.stabilityAiApiKey}"
73+
NetworkHeaders.AUTHORIZATION to key
74+
}
75+
7076
else -> null
7177
}
7278
}
@@ -94,6 +100,7 @@ val providersModule = module {
94100
override val hordeSignUpUrl: String = BuildConfig.HORDE_AI_SIGN_UP_URL
95101
override val huggingFaceUrl: String = BuildConfig.HUGGING_FACE_INFO_URL
96102
override val openAiInfoUrl: String = BuildConfig.OPEN_AI_INFO_URL
103+
override val stabilityAiInfoUrl: String = BuildConfig.STABILITY_AI_INFO_URL
97104
override val privacyPolicyUrl: String = BuildConfig.POLICY_URL
98105
override val donateUrl: String = BuildConfig.DONATE_URL
99106
override val gitHubSourceUrl: String = BuildConfig.GITHUB_SOURCE_URL

core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ interface LinksProvider {
55
val hordeSignUpUrl: String
66
val huggingFaceUrl: String
77
val openAiInfoUrl: String
8+
val stabilityAiInfoUrl: String
89
val privacyPolicyUrl: String
910
val donateUrl: String
1011
val gitHubSourceUrl: String
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.shifthackz.aisdv1.core.common.model
2+
3+
import java.io.Serializable
4+
5+
6+
data class Quadruple<out A, out B, out C, out D>(
7+
val first: A,
8+
val second: B,
9+
val third: C,
10+
val fourth: D,
11+
) : Serializable {
12+
13+
override fun toString(): String = "($first, $second, $third, $fourth)"
14+
}

data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.shifthackz.aisdv1.data.local.DownloadableModelLocalDataSource
66
import com.shifthackz.aisdv1.data.local.GenerationResultLocalDataSource
77
import com.shifthackz.aisdv1.data.local.HuggingFaceModelsLocalDataSource
88
import com.shifthackz.aisdv1.data.local.ServerConfigurationLocalDataSource
9+
import com.shifthackz.aisdv1.data.local.StabilityAiCreditsLocalDataSource
910
import com.shifthackz.aisdv1.data.local.StableDiffusionEmbeddingsLocalDataSource
1011
import com.shifthackz.aisdv1.data.local.StableDiffusionHyperNetworksLocalDataSource
1112
import com.shifthackz.aisdv1.data.local.StableDiffusionLorasLocalDataSource
@@ -15,6 +16,7 @@ import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource
1516
import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource
1617
import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource
1718
import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource
19+
import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource
1820
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionEmbeddingsDataSource
1921
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource
2022
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionLorasDataSource
@@ -29,6 +31,7 @@ import org.koin.dsl.module
2931

3032
val localDataSourceModule = module {
3133
singleOf(::DatabaseClearGatewayImpl) bind DatabaseClearGateway::class
34+
singleOf(::StabilityAiCreditsLocalDataSource) bind StabilityAiCreditsDataSource.Local::class
3235
factoryOf(::StableDiffusionModelsLocalDataSource) bind StableDiffusionModelsDataSource.Local::class
3336
factoryOf(::StableDiffusionSamplersLocalDataSource) bind StableDiffusionSamplersDataSource.Local::class
3437
factoryOf(::StableDiffusionLorasLocalDataSource) bind StableDiffusionLorasDataSource.Local::class

data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import com.shifthackz.aisdv1.data.remote.HuggingFaceModelsRemoteDataSource
1111
import com.shifthackz.aisdv1.data.remote.OpenAiGenerationRemoteDataSource
1212
import com.shifthackz.aisdv1.data.remote.RandomImageRemoteDataSource
1313
import com.shifthackz.aisdv1.data.remote.ServerConfigurationRemoteDataSource
14+
import com.shifthackz.aisdv1.data.remote.StabilityAiCreditsRemoteDataSource
15+
import com.shifthackz.aisdv1.data.remote.StabilityAiEnginesRemoteDataSource
16+
import com.shifthackz.aisdv1.data.remote.StabilityAiGenerationRemoteDataSource
1417
import com.shifthackz.aisdv1.data.remote.StableDiffusionEmbeddingsRemoteDataSource
1518
import com.shifthackz.aisdv1.data.remote.StableDiffusionGenerationRemoteDataSource
1619
import com.shifthackz.aisdv1.data.remote.StableDiffusionHyperNetworksRemoteDataSource
@@ -24,6 +27,9 @@ import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource
2427
import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource
2528
import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource
2629
import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource
30+
import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource
31+
import com.shifthackz.aisdv1.domain.datasource.StabilityAiEnginesDataSource
32+
import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource
2733
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionEmbeddingsDataSource
2834
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionGenerationDataSource
2935
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource
@@ -65,6 +71,9 @@ val remoteDataSourceModule = module {
6571
factoryOf(::RandomImageRemoteDataSource) bind RandomImageDataSource.Remote::class
6672
factoryOf(::DownloadableModelRemoteDataSource) bind DownloadableModelDataSource.Remote::class
6773
factoryOf(::HuggingFaceModelsRemoteDataSource) bind HuggingFaceModelsDataSource.Remote::class
74+
factoryOf(::StabilityAiGenerationRemoteDataSource) bind StabilityAiGenerationDataSource.Remote::class
75+
factoryOf(::StabilityAiCreditsRemoteDataSource) bind StabilityAiCreditsDataSource.Remote::class
76+
factoryOf(::StabilityAiEnginesRemoteDataSource) bind StabilityAiEnginesDataSource.Remote::class
6877

6978
factory<ServerConnectivityGateway> {
7079
val lambda: () -> Boolean = {

data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import com.shifthackz.aisdv1.data.repository.LocalDiffusionGenerationRepositoryI
1111
import com.shifthackz.aisdv1.data.repository.OpenAiGenerationRepositoryImpl
1212
import com.shifthackz.aisdv1.data.repository.RandomImageRepositoryImpl
1313
import com.shifthackz.aisdv1.data.repository.ServerConfigurationRepositoryImpl
14+
import com.shifthackz.aisdv1.data.repository.StabilityAiCreditsRepositoryImpl
15+
import com.shifthackz.aisdv1.data.repository.StabilityAiEnginesRepositoryImpl
16+
import com.shifthackz.aisdv1.data.repository.StabilityAiGenerationRepositoryImpl
1417
import com.shifthackz.aisdv1.data.repository.StableDiffusionEmbeddingsRepositoryImpl
1518
import com.shifthackz.aisdv1.data.repository.StableDiffusionGenerationRepositoryImpl
1619
import com.shifthackz.aisdv1.data.repository.StableDiffusionHyperNetworksRepositoryImpl
@@ -28,6 +31,9 @@ import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepositor
2831
import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository
2932
import com.shifthackz.aisdv1.domain.repository.RandomImageRepository
3033
import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository
34+
import com.shifthackz.aisdv1.domain.repository.StabilityAiCreditsRepository
35+
import com.shifthackz.aisdv1.domain.repository.StabilityAiEnginesRepository
36+
import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository
3137
import com.shifthackz.aisdv1.domain.repository.StableDiffusionEmbeddingsRepository
3238
import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository
3339
import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository
@@ -54,6 +60,9 @@ val repositoryModule = module {
5460
factoryOf(::HordeGenerationRepositoryImpl) bind HordeGenerationRepository::class
5561
factoryOf(::HuggingFaceGenerationRepositoryImpl) bind HuggingFaceGenerationRepository::class
5662
factoryOf(::OpenAiGenerationRepositoryImpl) bind OpenAiGenerationRepository::class
63+
factoryOf(::StabilityAiGenerationRepositoryImpl) bind StabilityAiGenerationRepository::class
64+
factoryOf(::StabilityAiCreditsRepositoryImpl) bind StabilityAiCreditsRepository::class
65+
factoryOf(::StabilityAiEnginesRepositoryImpl) bind StabilityAiEnginesRepository::class
5766
factoryOf(::StableDiffusionGenerationRepositoryImpl) bind StableDiffusionGenerationRepository::class
5867
factoryOf(::StableDiffusionModelsRepositoryImpl) bind StableDiffusionModelsRepository::class
5968
factoryOf(::StableDiffusionSamplersRepositoryImpl) bind StableDiffusionSamplersRepository::class
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.shifthackz.aisdv1.data.local
2+
3+
import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource
4+
import io.reactivex.rxjava3.core.BackpressureStrategy
5+
import io.reactivex.rxjava3.core.Completable
6+
import io.reactivex.rxjava3.subjects.BehaviorSubject
7+
8+
internal class StabilityAiCreditsLocalDataSource : StabilityAiCreditsDataSource.Local {
9+
10+
private val creditsSubject: BehaviorSubject<Float> = BehaviorSubject.createDefault(0f)
11+
12+
override fun get() = creditsSubject
13+
.firstOrError()
14+
.onErrorReturn { 0f }
15+
16+
override fun save(value: Float) = Completable.fromAction {
17+
creditsSubject.onNext(value)
18+
}
19+
20+
override fun observe() = creditsSubject.toFlowable(BackpressureStrategy.LATEST)
21+
}

data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.shifthackz.aisdv1.data.mappers
22

33
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
44
import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload
5+
import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance
6+
import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset
57
import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest
68
import com.shifthackz.aisdv1.network.request.HuggingFaceGenerationRequest
79
import com.shifthackz.aisdv1.network.request.ImageToImageRequest
@@ -71,6 +73,26 @@ fun ImageToImagePayload.mapToHuggingFaceRequest(): HuggingFaceGenerationRequest
7173
)
7274
}
7375

76+
fun ImageToImagePayload.mapToStabilityAiRequest() = with(this) {
77+
buildMap {
78+
buildList {
79+
addAll(prompt.mapToStabilityPrompt(1.0))
80+
addAll(negativePrompt.mapToStabilityPrompt(-1.0))
81+
}.forEachIndexed { index, stpRaw ->
82+
this["text_prompts[$index][text]"] = stpRaw.text
83+
this["text_prompts[$index][weight]"] = stpRaw.weight.toString()
84+
}
85+
this["image_strength"] = "$denoisingStrength"
86+
this["cfg_scale"] = "$cfgScale"
87+
this["clip_guidance_preset"] = (stabilityAiClipGuidance ?: StabilityAiClipGuidance.NONE).toString()
88+
this["seed"] = (seed.toLongOrNull()?.coerceIn(0L .. 4294967295L) ?: 0L).toString()
89+
this["steps"] = "$samplingSteps"
90+
stabilityAiStylePreset?.takeIf { it != StabilityAiStylePreset.NONE }?.key?.let {
91+
this["style_preset"] = it
92+
}
93+
}
94+
}
95+
7496
fun Pair<ImageToImagePayload, SdGenerationResponse>.mapToAiGenResult(): AiGenerationResult =
7597
let { (payload, response) ->
7698
AiGenerationResult(
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.shifthackz.aisdv1.data.mappers
2+
3+
import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4+
import com.shifthackz.aisdv1.network.model.StabilityAiEngineRaw
5+
6+
//region RAW --> DOMAIN
7+
fun List<StabilityAiEngineRaw>.mapRawToDomain(): List<StabilityAiEngine> =
8+
map(StabilityAiEngineRaw::mapRawToDomain)
9+
10+
fun StabilityAiEngineRaw.mapRawToDomain(): StabilityAiEngine = with(this) {
11+
StabilityAiEngine(id ?: "", name ?: "")
12+
}
13+
//endregion

0 commit comments

Comments
 (0)