# ERNIE AI Provider for Vercel AI SDK

[![npm version](https://badge.fury.io/js/ernie-ai-provider.svg)](https://badge.fury.io/js/ernie-ai-provider)
[![npm downloads](https://img.shields.io/npm/dm/ernie-ai-provider.svg)](https://www.npmjs.com/package/ernie-ai-provider)

百度千帆大模型的 Vercel AI SDK 简易版社区provider，支持 ERNIE 系列模型与 Vercel AI 的集成。

## 特性

- 🚀 支持 ERNIE
- 🎨 与 Vercel AI SDK 集成
- 🌊 流式响应支持
- 🎯 结构化数据生成（JSON 对象）
- 📊 流式结构化对象生成（实时生成结构化数据）
- 🛠️ 工具调用（Function Calling）
- 🔧 TypeScript 支持
- 🔍 网络搜索功能（实时信息获取）
- 👤 系统人设和角色定制
- 🎯 搜索过滤和域名限制
- 📈 流式响应增强选项

## 安装

```bash
# 使用 npm
npm install ernie-ai-provider

# 使用 yarn
yarn add ernie-ai-provider

# 使用 pnpm
pnpm add ernie-ai-provider
```

## 环境变量

```bash
QIANFAN_API_KEY="your-api-key"
```

## 快速开始

### 基础用法

```typescript
import { ernie } from 'ernie-ai-provider';
import { generateText } from 'ai';

const { text } = await generateText({
  model: ernie('ernie-4.0-8k'),
  prompt: '请写一个关于人工智能的简短介绍',
});

console.log(text);
```

### 自定义配置

```typescript
import { createErnie } from 'ernie-ai-provider';
import { generateText } from 'ai';

const ernie = createErnie({
  apiKey: 'your-api-key',
  baseURL: 'https://qianfan.baidubce.com/v2', // 可选
});

const { text } = await generateText({
  model: ernie('ernie-4.0-8k'),
  prompt: '请解释什么是机器学习',
});
```

### 流式响应

```typescript
import { ernie } from 'ernie-ai-provider';
import { streamText } from 'ai';

const { textStream } = await streamText({
  model: ernie('ernie-4.0-8k'),
  prompt: '请详细解释机器学习的基本概念',
});

for await (const delta of textStream) {
  process.stdout.write(delta);
}
```

### 结构化数据生成

```typescript
import { ernie } from 'ernie-ai-provider';
import { generateObject } from 'ai';
import { z } from 'zod';

const result = await generateObject({
  model: ernie('ernie-4.0-8k'),
  schema: z.object({
    recipe: z.object({
      name: z.string(),
      ingredients: z.array(
        z.object({
          name: z.string(),
          amount: z.string(),
        })
      ),
      steps: z.array(z.string()),
    }),
  }),
  prompt: '生成一个宫保鸡丁的菜谱',
});

console.log(JSON.stringify(result.object.recipe, null, 2));
```

### 流式结构化数据生成

```typescript
import { ernie } from 'ernie-ai-provider';
import { streamObject } from 'ai';
import { z } from 'zod';

const productSchema = z.object({
  name: z.string().describe('产品名称'),
  category: z.string().describe('产品分类'),
  price: z.number().describe('价格'),
  features: z.array(z.string()).describe('产品特性'),
  specifications: z.object({
    weight: z.string(),
    dimensions: z.string(),
    color: z.string(),
  }),
});

const { partialObjectStream, object } = await streamObject({
  model: ernie('ernie-4.0-8k'),
  schema: productSchema,
  prompt: '生成一个智能手机的产品信息',
});

// 实时显示生成过程
for await (const partialObject of partialObjectStream) {
  console.log('生成中:', JSON.stringify(partialObject, null, 2));
}

// 获取最终结果
const finalProduct = await object;
console.log('完成:', JSON.stringify(finalProduct, null, 2));
```

### 工具调用

```javascript
import { ernie } from 'ernie-ai-provider';
import { generateText, tool } from 'ai';
import { z } from 'zod';

const getWeatherTool = tool({
  description: '获取指定城市的天气信息',
  parameters: z.object({
    city: z.string().describe('城市名称'),
  }),
  execute: async ({ city }) => {
    // 这里应该调用真实的天气API
    return `${city}的天气：晴天，温度25°C`;
  },
});

const result = await generateText({
  model: ernie('ernie-4.0-8k'),
  prompt: '北京今天天气怎么样？',
  tools: {
    getWeather: getWeatherTool,
  },
});

console.log(result.text);
```

### 网络搜索功能

```javascript
import { ernie } from 'ernie-ai-provider';
import { generateText } from 'ai';

const result = await generateText({
  model: ernie('ernie-4.0-8k', {
    web_search: {
      enable_citation: true,    // 启用引用信息
      enable_trace: true,       // 启用搜索轨迹
      enable_status: true,      // 启用状态信息
    }
  }),
  prompt: '请告诉我最新的AI技术发展动态',
});

console.log(result.text);
```

### 系统人设和角色定制

```javascript
import { ernie } from 'ernie-ai-provider';
import { generateText } from 'ai';

const result = await generateText({
  model: ernie('ernie-4.0-8k'),
  prompt: '请分析一下当前的股市走势',
  // 设置系统人设
  system: '你是一位资深的金融分析师，拥有15年的投资经验',
  // 设置详细指令
  instruction: '请用专业术语分析，并提供具体的数据支撑',
  userId: 'analyst_001',
  maxOutputTokens: 600,
});

console.log(result.text);
```

## API 参考

### `createErnie(options)`

创建一个自定义的 ERNIE 提供商实例。

**参数：**
- `options.apiKey` (string, 可选): API 密钥，默认从 `QIANFAN_API_KEY` 环境变量读取
- `options.baseURL` (string, 可选): 自定义 API 基础 URL
- `options.headers` (Record<string, string>, 可选): 自定义请求头

### `ernie(modelId, settings?)`

创建一个 ERNIE 语言模型实例。

**参数：**
- `modelId` (string): 模型标识符
- `settings` (object, 可选): 模型设置
  - `temperature` (number): 控制输出随机性，范围 0-1
  - `topP` (number): 核采样参数，范围 0-1
  - `maxTokens` (number): 最大输出令牌数
  - `penaltyScore` (number): 重复惩罚分数，范围 1.0-2.0

## 许可证

MIT

## 贡献

欢迎提交 Issue 和 Pull Request！

## 相关链接

- [Vercel AI SDK](https://sdk.vercel.ai/)
- [百度千帆大模型平台](https://cloud.baidu.com/product/wenxinworkshop)
- [千帆 API 文档](https://cloud.baidu.com/doc/qianfan-api/)