积极拥抱AI,ComposeHooks让你更方便地使用AI

在 Compose 项目中集成 AI 功能,你是不是也遇到过这些问题?

不同 AI 服务商的 API 各不相同,如何统一管理?多模态输入(文本、图片)怎么优雅处理?AI 返回的 JSON 如何自动解析成类型安全的对象?

现在,ComposeHooks 推出了 AI 模块,让我们在 Compose 中使用 AI 变得前所未有的简单。

两个核心 Hooks

useChat - 多提供商聊天对话

useChat 是一个功能强大的聊天对话 hook,支持 10+ AI 服务商:

kotlin 复制代码
val (messages, isLoading, error, sendMessage, setMessages, append, reload, stop) = useChat {
    provider = Providers.OpenAI(apiKey = "sk-xxx")
    systemPrompt = "你是一个助手"
    temperature = 0.7f
}

// 发送文本消息
sendMessage("你好")

// 发送图片消息
sendMessage.withImage("这是什么图片?", base64Image, "image/jpeg")

// 重新生成最后回复
reload()

支持的 Provider 包括:

  • OpenAI、DeepSeek、Moonshot、Zhipu、Qwen、Groq、Together、MiMo(OpenAI 兼容)
  • Anthropic(Claude 系列)
  • Custom(自定义 OpenAI 兼容服务)

useGenerateObject - 结构化对象生成

这个 hook 是我在 EatWhat 项目中最常用的,它可以基于 JSON Schema 生成指定类型的数据:

kotlin 复制代码
@Schema
@Serializable
data class Recipe(
    @Description("菜名")
    val name: String,
    @Description("食材列表")
    val ingredients: List<String>,
    @Description("烹饪步骤")
    val steps: List<String>
)

val (recipe, rawJson, isLoading, error, submit, stop) = useGenerateObject<Recipe>(
    schemaString = Recipe::class.jsonSchemaString,
) {
    provider = Providers.DeepSeek(apiKey = "sk-xxx")
}

// 生成食谱
submit("生成油爆双脆的菜谱")

它会自动:

  • 注入 JSON Schema 到系统提示
  • 解析返回的 JSON 并生成类型安全对象
  • 支持多模态输入(文本、图片)
  • 内置错误处理

PS:建议配合 kotlinx-schema 使用,可以方便的从 Kotlin 类型创建 JSON Schema

实际项目案例

在 EatWhat 项目的菜谱分析功能中,我使用 useGenerateObject 实现了一个支持文本+图片输入的 AI 分析功能:

kotlin 复制代码
import xyz.junerver.compose.ai.invoke

val (prompt, setPrompt) = useGetState(initialPrompt ?: "")
var selectedImageBase64 by _useState<String?>(null)

val systemPrompt = """
    你是一个专业的菜谱分析助手。请分析用户的输入(菜谱描述、做法、图片等),
    并输出符合 JSON Schema 的菜谱数据。

    注意:
    1. type 必须是 MEAT(荤菜), VEG(素菜), SOUP(汤), STAPLE(主食), OTHER(其他) 之一
    2. unit 必须是 G(克), ML(毫升), PIECE(个), SPOON(勺), MODERATE(适量) 之一
    3. icon 请根据菜品内容选择一个最合适的 Emoji
    4. 如果输入信息不全,请根据经验合理补全
""".trimIndent()

val (recipe, rawJson, isLoading, error, submit, _) = useGenerateObject<RecipeAIResult>(
    schemaString = RecipeAIResult::class.jsonSchemaString,
) {
    activeProvider?.let { provider ->
        this.provider = Providers.OpenAI(
            baseUrl = provider.baseUrl,
            apiKey = provider.apiKey
        )
        this.model = provider.model
    }
    this.systemPrompt = systemPrompt
    timeout = 60.seconds
}

// 触发分析
val onAnalyze = {
    if (selectedImageBase64 != null) {
        submit(promptText, selectedImageBase64!!, "image/webp")
    } else {
        submit(promptText)
    }
}

这个实现有几个亮点:

  1. 多模态输入 - 用户可以输入文字描述,也可以上传图片,AI 会综合分析
  2. 类型安全 - 返回的 Recipe 是一个数据类,直接使用即可,无需手动解析 JSON
  3. 状态管理 - isLoading、error 等状态自动管理,UI 响应式更新
  4. 配置灵活 - 可以动态切换 AI 服务商、模型、超时时间等

核心优势

与手动封装 OAI 接口请求方式相比,ComposeHooks AI 模块的优势非常明显:

  • 统一接口 - 无需关心不同服务商的 API 差异
  • 多模态支持 - 文本、图片、文件无缝集成
  • 类型安全 - GenerateObject 确保输出类型正确
  • Compose 友好 - 完全适配 Compose 生命周期
  • 流式响应 - 实时显示 AI 回复(useChat)

探索更多

项目开源地址:junerver/ComposeHooks

欢迎尝鲜 beta 版本:

kotlin 复制代码
implementation("xyz.junerver.compose:hooks2-ai:2.2.2-beta-1")

欢迎使用、勘误、PR。

注意:该模块尚在积极开发中,工件id、接口参数可能会随着版本更新发生变化,请访问 ComposeHooks 确认最新版本与使用说明。

相关推荐
geovindu8 分钟前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
IT_陈寒30 分钟前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信32 分钟前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
蜗牛互联网41 分钟前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
计算机魔术师1 小时前
Perplexity:每个 Project 都是一个 Git 仓库
前端
Andrew5511 小时前
让 AI 写页面不再“一眼假”:我把设计品味做成了一个 Claude Code Skill 流水线
前端
乐享qicheng1 小时前
14-AI智能管家JSBridge深度问答
前端
10年前端老司机2 小时前
我用 Vue3 + LangGraph 做了个心理咨询 AI,踩了 9 个坑后总结出来的实战经验
前端·langchain·agent
数据掘金2 小时前
A/B 实验分组参数回滚后还在生效?一次参数校验体系的重构复盘
前端
知之则吱吱2 小时前
Android 开发者验证机制迎来新变化:核心要求、实施时间与开发者应对指南
android·google