Flutter浏览器AI功能插件chrome_ai的使用

Flutter浏览器AI功能插件chrome_ai的使用

ChromeAI

最近,Chrome 浏览器新增了 window.ai 功能——内置了 Gemini Nano AI 模型,这意味着开发者可以在浏览器中直接使用设备上的 AI 而无需任何配置。

我相信这将真正改变网络应用。应用场景无穷无尽:智能自动补全、错误修正与验证、自然语言过滤、表单自动填充、UI 建议、初步摘要和搜索等。

因此,我开发了一个库来在 Flutter 中启用此功能。有了这个库,你也可以轻松地在 Flutter Web 中使用这一功能。

安装

你可以观看以下视频了解如何在 Chrome 中启用 AI 并运行此库。

1. 启用 AI 在 Chrome 中

Chrome 内置的 AI 是一个预览功能,你需要使用版本 127 或更高的 Chrome,现在可以在 开发版 Canary 版 中找到,可能在 2024 年 7 月 17 日发布到稳定版

之后,你需要开启以下标志:

  • <a>chrome://flags/#prompt-api-for-gemini-nano</a>: 启用
  • <a>chrome://flags/#optimization-guide-on-device-model</a>: 启用 BypassPrefRequirement
  • <a>chrome://components/</a>: 点击 Optimization Guide On Device Model 下载模型。

2. 添加库

flutter pub add chrome_ai

3. 运行你的项目

1. 打开终端并运行 Web 服务器

flutter run -d web-server

2. 打开 Chrome 开发版或 Canary 版,并在 http://localhost:port 中打开你的项目

使用

检查 Chrome AI 的可用性

import 'package:chrome_ai/chrome_ai.dart';

final availability = await ChromeAI.canCreateTextSession();
if(availability == AIModelAvailability.no){
    // 无法创建文本会话
}else if(availability == AIModelAvailability.afterDownload) {
    // 需要下载模型
}else if(availability == AIModelAvailability.readily){
    // 模型已准备好
}

生成文本

import 'package:chrome_ai/chrome_ai.dart';

final session = await ChromeAI.createTextSession();
var result = await session.prompt("为什么天空是蓝色的?");
print(result);  

生成流式文本

import 'package:chrome_ai/chrome_ai.dart';

final session = await ChromeAI.createTextSession();
final stream = session.promptStreaming("为什么天空是蓝色的?");

stream.listen((result) {
  print(result);
}).onError((e, stackTrace) {
  print(e.toString());
});

需要帮助!

该项目非常新。如果你有任何问题,请打开一个 issue。贡献非常欢迎。


示例代码

以下是完整的示例代码,展示了如何在 Flutter 应用中使用 chrome_ai 插件。

import 'package:chrome_ai/chrome_ai.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller =
      TextEditingController(text: "为什么天空是蓝色的?");
  String _displayText = "This space is filled with text.";
  String? _error;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _controller,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: '输入一些文本',
              ),
            ),
            const SizedBox(height: 10),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: () async {
                    final availability = await ChromeAI.canCreateTextSession();
                    if (availability == AIModelAvailability.no) {
                      // 无法创建文本会话
                    } else if (availability ==
                        AIModelAvailability.afterDownload) {
                      // 需要下载模型
                    } else if (availability == AIModelAvailability.readily) {
                      // 模型已准备好
                    }
                    setState(() {
                      _displayText = availability.toString();
                    });
                  },
                  child: const Text('是否可以创建文本会话?'),
                ),
                const SizedBox(width: 10),
                ElevatedButton(
                  onPressed: () async {
                    final session = await ChromeAI.createTextSession();
                    var result = await session.prompt(_controller.text);

                    setState(() {
                      _displayText = result;
                    });
                  },
                  child: const Text('生成文本'),
                ),
                const SizedBox(width: 10),
                ElevatedButton(
                  onPressed: () async {
                    final session = await ChromeAI.createTextSession();
                    final stream = session.promptStreaming(_controller.text);

                    stream.listen((result) {
                      setState(() {
                        _displayText = result;
                      });
                    }).onError((e, stackTrace) {
                      setState(() {
                        _error = e.toString();
                      });
                    });
                  },
                  child: const Text('流式生成文本'),
                ),
              ],
            ),
            const SizedBox(height: 20),
            if (_error != null)
              Text('错误: $_error', style: const TextStyle(color: Colors.red)),
            Expanded(
              child: SingleChildScrollView(
                child: Text(
                  _displayText,
                  style: Theme.of(context).textTheme.bodyLarge,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter浏览器AI功能插件chrome_ai的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter浏览器AI功能插件chrome_ai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为一个IT专家,我可以为你提供一个关于如何在Flutter项目中集成并使用chrome_ai插件的示例代码。chrome_ai是一个假设存在的插件,用于在Flutter应用中提供基于Chrome的AI功能。请注意,实际开发中可能需要查找并安装真实的插件,或者根据具体插件的文档进行调整。

以下是一个基本的示例,展示了如何在Flutter应用中集成并使用一个名为chrome_ai的插件。

1. 添加插件依赖

首先,你需要在pubspec.yaml文件中添加chrome_ai插件的依赖。请注意,这里的插件名和版本号是假设的,你需要根据实际情况进行替换。

dependencies:
  flutter:
    sdk: flutter
  chrome_ai: ^1.0.0  # 假设的版本号

2. 导入插件并初始化

在你的Flutter应用的Dart文件中(例如main.dart),导入chrome_ai插件并进行初始化。

import 'package:flutter/material.dart';
import 'package:chrome_ai/chrome_ai.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Chrome AI Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ChromeAIDemo(),
    );
  }
}

class ChromeAIDemo extends StatefulWidget {
  @override
  _ChromeAIDemoState createState() => _ChromeAIDemoState();
}

class _ChromeAIDemoState extends State<ChromeAIDemo> {
  ChromeAI? chromeAI;

  @override
  void initState() {
    super.initState();
    // 初始化chrome_ai插件
    chromeAI = ChromeAI();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chrome AI Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '使用Chrome AI插件',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 调用AI功能,例如文本分析
                chromeAI?.analyzeText("Hello, this is a test text for Chrome AI plugin.")
                  .then((result) {
                    // 处理结果
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text("AI 分析结果: $result"),
                      ),
                    );
                  })
                  .catchError((error) {
                    // 处理错误
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text("AI 分析出错: $error"),
                        backgroundColor: Colors.red,
                      ),
                    );
                  });
              },
              child: Text('分析文本'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 插件方法实现(假设)

请注意,这里的ChromeAI类和它的analyzeText方法是假设的。在实际开发中,你需要根据chrome_ai插件提供的API文档来实现这些方法。

class ChromeAI {
  // 假设的API调用,实际开发中需要替换为插件提供的真实方法
  Future<String> analyzeText(String text) async {
    // 这里应该包含与Chrome AI服务交互的代码
    // 例如发送HTTP请求,处理响应等
    // 这里仅返回一个假设的结果
    return "Analyzed text: $text";
  }
}

注意事项

  1. 插件真实性chrome_ai是一个假设的插件名称,你需要查找并安装一个真实存在的、提供类似功能的Flutter插件。
  2. API文档:实际开发中,你需要参考插件的官方API文档来了解如何正确初始化插件、调用其功能以及处理错误。
  3. 权限和网络:如果你的插件需要与互联网上的AI服务交互,确保你的应用有适当的网络权限,并处理网络错误和超时情况。

希望这个示例能帮助你在Flutter项目中集成并使用chrome_ai插件(或类似的插件)。如果有任何其他问题,请随时提问!

回到顶部