@cherrystudio/ai-core
Cherry Studio AI Core 是一个基于 Vercel AI SDK 的统一 AI Provider 接口包,为 AI 应用提供强大的抽象层和插件化架构。
✨ 核心亮点
🏗️ 优雅的架构设计
- 简化分层:
models
(模型层)→ runtime
(运行时层),清晰的职责分离
- 函数式优先:避免过度抽象,提供简洁直观的 API
- 类型安全:完整的 TypeScript 支持,直接复用 AI SDK 类型系统
- 最小包装:直接使用 AI SDK 的接口,避免重复定义和性能损耗
🔌 强大的插件系统
- 生命周期钩子:支持请求全生命周期的扩展点
- 流转换支持:基于 AI SDK 的
experimental_transform
实现流处理
- 插件分类:First、Sequential、Parallel 三种钩子类型,满足不同场景
- 内置插件:webSearch、logging、toolUse 等开箱即用的功能
🌐 统一多 Provider 接口
- 扩展注册:支持自定义 Provider 注册,无限扩展能力
- 配置统一:统一的配置接口,简化多 Provider 管理
🚀 多种使用方式
- 函数式调用:适合简单场景的直接函数调用
- 执行器实例:适合复杂场景的可复用执行器
- 静态工厂:便捷的静态创建方法
- 原生兼容:完全兼容 AI SDK 原生 Provider Registry
🔮 面向未来
- Agent 就绪:为 OpenAI Agents SDK 集成预留架构空间
- 模块化设计:独立包结构,支持跨项目复用
- 渐进式迁移:可以逐步从现有 AI SDK 代码迁移
特性
- 🚀 统一的 AI Provider 接口
- 🔄 动态导入支持
- 🛠️ TypeScript 支持
- 📦 强大的插件系统
- 🌍 内置webSearch(Openai,Google,Anthropic,xAI)
- 🎯 多种使用模式(函数式/实例式/静态工厂)
- 🔌 可扩展的 Provider 注册系统
- 🧩 完整的中间件支持
- 📊 插件统计和调试功能
支持的 Providers
基于 AI SDK 官方支持的 providers:
核心 Providers(内置支持):
- OpenAI
- Anthropic
- Google Generative AI
- OpenAI-Compatible
- xAI (Grok)
- Azure OpenAI
- DeepSeek
扩展 Providers(通过注册API支持):
- Google Vertex AI
- ...
- 自定义 Provider
安装
npm install @cherrystudio/ai-core ai
React Native
如果你在 React Native 项目中使用此包,需要在 metro.config.js
中添加以下配置:
const { getDefaultConfig } = require('expo/metro-config')
const config = getDefaultConfig(__dirname)
config.resolver.resolverMainFields = ['react-native', 'browser', 'main']
config.resolver.platforms = ['ios', 'android', 'native', 'web']
module.exports = config
还需要安装你要使用的 AI SDK provider:
npm install @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/google
使用示例
基础用法
import { AiCore } from '@cherrystudio/ai-core'
const executor = AiCore.create('openai', {
apiKey: 'your-api-key'
})
const result = await executor.streamText('gpt-4', {
messages: [{ role: 'user', content: 'Hello!' }]
})
const response = await executor.generateText('gpt-4', {
messages: [{ role: 'user', content: 'Hello!' }]
})
便捷函数
import { createOpenAIExecutor } from '@cherrystudio/ai-core'
const executor = createOpenAIExecutor({
apiKey: 'your-api-key'
})
const result = await executor.streamText('gpt-4', {
messages: [{ role: 'user', content: 'Hello!' }]
})
多 Provider 支持
import { AiCore } from '@cherrystudio/ai-core'
const openaiExecutor = AiCore.create('openai', { apiKey: 'openai-key' })
const anthropicExecutor = AiCore.create('anthropic', { apiKey: 'anthropic-key' })
const googleExecutor = AiCore.create('google', { apiKey: 'google-key' })
const xaiExecutor = AiCore.create('xai', { apiKey: 'xai-key' })
扩展 Provider 注册
对于非内置的 providers,可以通过注册 API 扩展支持:
import { registerProvider, AiCore } from '@cherrystudio/ai-core'
import { createGroq } from '@ai-sdk/groq'
registerProvider({
id: 'groq',
name: 'Groq',
creator: createGroq,
supportsImageGeneration: false
})
const groqExecutor = AiCore.create('groq', { apiKey: 'groq-key' })
registerProvider({
id: 'mistral',
name: 'Mistral AI',
import: () => import('@ai-sdk/mistral'),
creatorFunctionName: 'createMistral'
})
const mistralExecutor = AiCore.create('mistral', { apiKey: 'mistral-key' })
🔌 插件系统
AI Core 提供了强大的插件系统,支持请求全生命周期的扩展。
内置插件
webSearchPlugin - 网络搜索插件
为不同 AI Provider 提供统一的网络搜索能力:
import { webSearchPlugin } from '@cherrystudio/ai-core/built-in/plugins'
const executor = AiCore.create('openai', { apiKey: 'your-key' }, [
webSearchPlugin({
openai: {
},
anthropic: { maxUses: 5 },
google: {
},
xai: {
mode: 'on',
returnCitations: true,
maxSearchResults: 5,
sources: [{ type: 'web' }, { type: 'x' }, { type: 'news' }]
}
})
])
loggingPlugin - 日志插件
提供详细的请求日志记录:
import { createLoggingPlugin } from '@cherrystudio/ai-core/built-in/plugins'
const executor = AiCore.create('openai', { apiKey: 'your-key' }, [
createLoggingPlugin({
logLevel: 'info',
includeParams: true,
includeResult: false
})
])
promptToolUsePlugin - 提示工具使用插件
为不支持原生 Function Call 的模型提供 prompt 方式的工具调用:
import { createPromptToolUsePlugin } from '@cherrystudio/ai-core/built-in/plugins'
const executor = AiCore.create(
'providerId',
{
apiKey: 'your-key',
baseURL: 'https://your-model-endpoint'
},
[
createPromptToolUsePlugin({
enabled: true,
buildSystemPrompt: (userPrompt, tools) => {
return `${userPrompt}\n\nAvailable tools: ${Object.keys(tools).join(', ')}`
}
})
]
)
自定义插件
创建自定义插件非常简单:
import { definePlugin } from '@cherrystudio/ai-core'
const customPlugin = definePlugin({
name: 'custom-plugin',
enforce: 'pre',
onRequestStart: async (context) => {
console.log(`Starting request for model: ${context.modelId}`)
},
transformParams: async (params, context) => {
if (params.messages) {
params.messages.unshift({
role: 'system',
content: 'You are a helpful assistant.'
})
}
return params
},
transformResult: async (result, context) => {
if (result.text) {
result.metadata = {
processedAt: new Date().toISOString(),
modelId: context.modelId
}
}
return result
}
})
const executor = AiCore.create('openai', { apiKey: 'your-key' }, [customPlugin])
使用 AI SDK 原生 Provider 注册表
https://ai-sdk.dev/docs/reference/ai-sdk-core/provider-registry
除了使用内建的 provider 管理,你还可以使用 AI SDK 原生的 createProviderRegistry
来构建自己的 provider 注册表。
基本用法示例
import { createClient } from '@cherrystudio/ai-core'
import { createProviderRegistry } from 'ai'
import { createOpenAI } from '@ai-sdk/openai'
import { anthropic } from '@ai-sdk/anthropic'
export const registry = createProviderRegistry({
anthropic,
openai: createOpenAI({
apiKey: process.env.OPENAI_API_KEY
})
})
const client = PluginEnabledAiClient.create('openai', {
apiKey: process.env.OPENAI_API_KEY
})
const result1 = await client.streamText('gpt-4', {
messages: [{ role: 'user', content: 'Hello with built-in logic!' }]
})
const result2 = await client.streamText({
model: registry.languageModel('openai:gpt-4'),
messages: [{ role: 'user', content: 'Hello with custom registry!' }]
})
await client.generateObject({
model: registry.languageModel('openai:gpt-4'),
schema: z.object({ name: z.string() }),
messages: [{ role: 'user', content: 'Generate a user' }]
})
await client.streamObject({
model: registry.languageModel('anthropic:claude-3-opus-20240229'),
schema: z.object({ items: z.array(z.string()) }),
messages: [{ role: 'user', content: 'Generate a list' }]
})
与插件系统配合使用
更强大的是,你还可以将自定义注册表与 Cherry Studio 的插件系统结合使用:
import { PluginEnabledAiClient } from '@cherrystudio/ai-core'
import { createProviderRegistry } from 'ai'
import { createOpenAI } from '@ai-sdk/openai'
import { anthropic } from '@ai-sdk/anthropic'
const client = PluginEnabledAiClient.create(
'openai',
{
apiKey: process.env.OPENAI_API_KEY
},
[LoggingPlugin, RetryPlugin]
)
const registry = createProviderRegistry({
openai: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),
anthropic: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
})
await client.streamText('gpt-4', {
messages: [{ role: 'user', content: 'Hello with plugins!' }]
})
await client.streamText({
model: registry.languageModel('anthropic:claude-3-opus-20240229'),
messages: [{ role: 'user', content: 'Hello from Claude!' }]
})
await client.generateObject({
model: registry.languageModel('openai:gpt-4'),
schema: z.object({ name: z.string() }),
messages: [{ role: 'user', content: 'Generate a user' }]
})
await client.streamObject({
model: registry.languageModel('openai:gpt-4'),
schema: z.object({ items: z.array(z.string()) }),
messages: [{ role: 'user', content: 'Generate a list' }]
})
混合使用的优势
- 灵活性:可以根据需要选择使用内建逻辑或自定义注册表
- 兼容性:完全兼容 AI SDK 的
createProviderRegistry
API
- 渐进式:可以逐步迁移现有代码,无需一次性重构
- 插件支持:自定义注册表仍可享受插件系统的部分功能
- 最佳实践:结合两种方式的优点,既有动态加载的性能优势,又有统一注册表的便利性
📚 相关资源
未来版本
- 🔮 多 Agent 编排
- 🔮 可视化插件配置
- 🔮 实时监控和分析
- 🔮 云端插件同步
📄 License
MIT License - 详见 LICENSE 文件
Cherry Studio AI Core - 让 AI 开发更简单、更强大、更灵活 🚀