Skip to content

Commit 6842ca8

Browse files
junerverclaude
andcommitted
⚡️ [AI]: Refactor examples to use hooks consistently
- Replace remember/LaunchedEffect with useCreation/useEffect - Add model input field for useGenerateObject example - Support additional providers (Groq, Together, MiMo, Anthropic) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent a3b2e55 commit 6842ca8

2 files changed

Lines changed: 36 additions & 8 deletions

File tree

app/src/commonMain/kotlin/xyz/junerver/composehooks/example/UseChatExample.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import androidx.compose.material3.OutlinedTextField
4343
import androidx.compose.material3.Surface
4444
import androidx.compose.material3.Text
4545
import androidx.compose.runtime.Composable
46-
import androidx.compose.runtime.LaunchedEffect
4746
import androidx.compose.runtime.getValue
4847
import androidx.compose.runtime.mutableStateOf
4948
import androidx.compose.runtime.remember
@@ -60,6 +59,9 @@ import xyz.junerver.compose.ai.usechat.Providers
6059
import xyz.junerver.compose.ai.usechat.TextPart
6160
import xyz.junerver.compose.ai.usechat.UserMessage
6261
import xyz.junerver.compose.ai.usechat.useChat
62+
import xyz.junerver.compose.hooks.getValue
63+
import xyz.junerver.compose.hooks.useCreation
64+
import xyz.junerver.compose.hooks.useEffect
6365
import xyz.junerver.compose.hooks.useState
6466

6567
/*
@@ -91,7 +93,7 @@ fun UseChatExample() {
9193
var model by useState("")
9294

9395
// Create provider instance based on selection
94-
val provider = remember(selectedType, apiKey) {
96+
val provider by useCreation(selectedType, apiKey) {
9597
when (selectedType) {
9698
ProviderType.OpenAI -> Providers.OpenAI(apiKey = apiKey)
9799
ProviderType.DeepSeek -> Providers.DeepSeek(apiKey = apiKey)
@@ -106,7 +108,7 @@ fun UseChatExample() {
106108
}
107109

108110
// Reset model when provider changes
109-
LaunchedEffect(selectedType) {
111+
useEffect(selectedType) {
110112
model = ""
111113
}
112114

@@ -120,11 +122,11 @@ fun UseChatExample() {
120122
}
121123
}
122124

123-
var inputText by remember { mutableStateOf("") }
125+
var inputText by useState("")
124126
val listState = rememberLazyListState()
125127

126128
// Auto-scroll to bottom
127-
LaunchedEffect(messages.value.size) {
129+
useEffect(messages.value.size) {
128130
if (messages.value.isNotEmpty()) {
129131
listState.animateScrollToItem(messages.value.size - 1)
130132
}

app/src/commonMain/kotlin/xyz/junerver/composehooks/example/UseGenerateObjectExample.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ import kotlinx.schema.Schema
5555
import kotlinx.serialization.Serializable
5656
import xyz.junerver.compose.ai.usechat.Providers
5757
import xyz.junerver.compose.ai.usegenerateobject.useGenerateObject
58+
import xyz.junerver.compose.hooks.getValue
59+
import xyz.junerver.compose.hooks.useCreation
60+
import xyz.junerver.compose.hooks.useEffect
5861
import xyz.junerver.compose.hooks.useState
5962

6063
/*
@@ -103,35 +106,50 @@ private val recipeSchema = Recipe::class.jsonSchemaString
103106

104107
/** Available provider types for selection */
105108
private enum class ObjectProviderType(val displayName: String) {
106-
DeepSeek("DeepSeek"),
107109
OpenAI("OpenAI"),
110+
DeepSeek("DeepSeek"),
108111
Moonshot("Moonshot"),
109112
Zhipu("Zhipu"),
110113
Qwen("Qwen"),
114+
Groq("Groq"),
115+
Together("Together"),
116+
MiMo("MiMo"),
117+
Anthropic("Anthropic"),
111118
}
112119

113120
@Composable
114121
fun UseGenerateObjectExample() {
115122
// Provider configuration
116123
var selectedType by useState(ObjectProviderType.DeepSeek)
117124
var apiKey by useState("")
125+
var model by useState("")
118126

119127
// Create provider instance
120-
val provider = remember(selectedType, apiKey) {
128+
val provider by useCreation(selectedType, apiKey) {
121129
when (selectedType) {
122-
ObjectProviderType.DeepSeek -> Providers.DeepSeek(apiKey = apiKey)
123130
ObjectProviderType.OpenAI -> Providers.OpenAI(apiKey = apiKey)
131+
ObjectProviderType.DeepSeek -> Providers.DeepSeek(apiKey = apiKey)
124132
ObjectProviderType.Moonshot -> Providers.Moonshot(apiKey = apiKey)
125133
ObjectProviderType.Zhipu -> Providers.Zhipu(apiKey = apiKey)
126134
ObjectProviderType.Qwen -> Providers.Qwen(apiKey = apiKey)
135+
ObjectProviderType.Groq -> Providers.Groq(apiKey = apiKey)
136+
ObjectProviderType.Together -> Providers.Together(apiKey = apiKey)
137+
ObjectProviderType.MiMo -> Providers.MiMo(apiKey = apiKey)
138+
ObjectProviderType.Anthropic -> Providers.Anthropic(apiKey = apiKey)
127139
}
128140
}
129141

142+
// Reset model when provider changes
143+
useEffect(selectedType) {
144+
model = ""
145+
}
146+
130147
// Use the hook
131148
val (recipe, rawJson, isLoading, error, submit, stop) = useGenerateObject<Recipe>(
132149
schemaString = recipeSchema,
133150
) {
134151
this.provider = provider
152+
this.model = model.ifBlank { null }
135153
systemPrompt = "你是一位专业的中餐厨师,擅长创作各种美味的菜谱。请根据用户的描述生成详细的菜谱。"
136154
onFinish = { recipe, usage ->
137155
println("Generated recipe: ${recipe.name}")
@@ -174,6 +192,14 @@ fun UseGenerateObjectExample() {
174192
onTypeChange = { selectedType = it },
175193
modifier = Modifier.weight(1f),
176194
)
195+
OutlinedTextField(
196+
value = model,
197+
onValueChange = { model = it },
198+
label = { Text("Model") },
199+
placeholder = { Text(provider.defaultModel) },
200+
modifier = Modifier.weight(1f),
201+
singleLine = true,
202+
)
177203
}
178204

179205
Spacer(modifier = Modifier.height(8.dp))

0 commit comments

Comments
 (0)