Flutter数据处理与查询插件groq的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter数据处理与查询插件groq的使用

概述

Groq Dart Package 提供了一个简单且优雅的方式集成Groq AI API,使开发者能够轻松地将对话式AI功能融入他们的Flutter应用程序中。该插件支持多种Groq AI模型,并提供易于发送消息和管理聊天的功能,同时允许设置自定义系统指令以指导AI行为。此外,它还提供了错误处理机制和友好的Flutter UI组件。

特性

  • 简单的API密钥配置
  • 支持多个Groq AI模型
  • 简化的消息发送和聊天管理
  • 自定义系统指令
  • 错误处理
  • Flutter友好的UI组件

安装

在您的pubspec.yaml文件中添加以下内容:

dependencies:
  groq: ^latest_version

然后运行:

flutter pub get

使用方法

1. API Key 配置

您可以在运行应用时通过命令行参数设置Groq API密钥:

flutter run --dart-define=groqApiKey='YOUR_GROQ_API_KEY'

2. 基本示例

初始化Groq客户端并开始聊天会话:

import 'package:groq/groq.dart';

final groq = Groq(
  apiKey: const String.fromEnvironment('groqApiKey'),
  model: "gemma-7b-it", // 可选:指定一个模型
);

groq.startChat();

// 发送消息并接收响应
GroqResponse response = await groq.sendMessage("Hello, how are you?");
print(response.choices.first.message.content);

3. 自定义系统指令

您可以设置自定义系统指令来引导AI的行为:

groq.setCustomInstructionsWith(
  "You are a helpful assistant who always responds in a friendly, concise manner. " +
  "Use casual language and provide clear, direct answers."
);

// 后续的消息将遵循这些指令
GroqResponse response = await groq.sendMessage("Tell me about AI");

4. 完整的Flutter聊天示例

下面是一个完整的Flutter聊天界面实现,包括用户输入框、消息显示以及与Groq服务交互的逻辑:

class ChatScreen extends StatefulWidget {
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final TextEditingController _textController = TextEditingController();
  final List<ChatMessage> _messages = [];
  final ScrollController _scrollController = ScrollController();

  /// flutter run --dart-define=groqApiKey='Your Api Key'
  final _groq = Groq(
    apiKey: const String.fromEnvironment('groqApiKey'),
    model: "gemma-7b-it", // 设置不同的模型
  );

  @override
  void initState() {
    super.initState();
    _groq.startChat();
  }

  void _handleSubmitted(String text) async {
    _textController.clear();
    ChatMessage message = ChatMessage(
      text: text,
      isUserMessage: true,
    );
    setState(() {
      _messages.add(message);
    });

    _scrollToBottomWithDelay(
      const Duration(milliseconds: 200),
    );

    _sendMessage(text);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('GroqChat'),
        actions: [_buildClearChatButton()],
      ),
      body: SafeArea(
        child: Column(
          children: <Widget>[
            Flexible(
              child: ListView.builder(
                controller: _scrollController,
                itemCount: _messages.length,
                itemBuilder: (_, int index) => _messages[index],
              ),
            ),
            const Divider(height: 1.0),
            Container(
              decoration: BoxDecoration(
                color: Theme.of(context).cardColor,
              ),
              child: _buildTextComposer(),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildClearChatButton() {
    return IconButton(
      onPressed: () {
        _groq.clearChat();
      },
      icon: const Icon(Icons.delete),
    );
  }

  Widget _buildTextComposer() {
    return IconTheme(
      data: IconThemeData(color: Theme.of(context).colorScheme.secondary),
      child: Container(
        margin: const EdgeInsets.symmetric(horizontal: 8.0),
        child: Row(
          children: <Widget>[
            Flexible(
              child: TextField(
                controller: _textController,
                decoration: const InputDecoration(
                  hintText: 'Send a message',
                  contentPadding: EdgeInsets.symmetric(horizontal: 16.0),
                  border: InputBorder.none,
                ),
              ),
            ),
            IconButton(
              icon: const Icon(Icons.send),
              onPressed: () => _handleSubmitted(_textController.text),
            ),
          ],
        ),
      ),
    );
  }

  _scrollToBottomWithDelay(Duration delay) async {
    await Future.delayed(delay);
    _scrollController.animateTo(
      _scrollController.position.maxScrollExtent,
      duration: const Duration(milliseconds: 300),
      curve: Curves.easeInOut,
    );
  }

  _sendMessage(String text) async {
    try {
      GroqResponse response = await _groq.sendMessage(text);

      ChatMessage responseMessage = ChatMessage(
        text: response.choices.first.message.content,
        isUserMessage: false,
      );

      setState(() {
        _messages.add(responseMessage);
      });
    } on GroqException catch (error) {
      ErrorMessage errorMessage = ErrorMessage(
        text: error.message,
      );

      setState(() {
        _messages.add(errorMessage);
      });
    }
    _scrollToBottomWithDelay(
      const Duration(milliseconds: 300),
    );
  }
}

class ChatMessage extends StatelessWidget {
  final String text;
  final bool isUserMessage;

  const ChatMessage({super.key, required this.text, this.isUserMessage = false});

  @override
  Widget build(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    final CrossAxisAlignment crossAxisAlignment =
        isUserMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start;

    return Column(
      crossAxisAlignment: crossAxisAlignment,
      children: [
        Container(
          margin: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
          padding: const EdgeInsets.all(10.0),
          decoration: BoxDecoration(
            color: isUserMessage
                ? theme.colorScheme.primaryContainer
                : theme.colorScheme.tertiaryContainer,
            borderRadius: isUserMessage
                ? const BorderRadius.only(
                    topLeft: Radius.circular(8.0),
                    topRight: Radius.circular(8.0),
                    bottomLeft: Radius.circular(8.0),
                    bottomRight: Radius.circular(0.0),
                  )
                : const BorderRadius.only(
                    topLeft: Radius.circular(0.0),
                    topRight: Radius.circular(8.0),
                    bottomLeft: Radius.circular(8.0),
                    bottomRight: Radius.circular(8.0),
                  ),
          ),
          child: Text(
            text,
            style: theme.textTheme.titleMedium,
          ),
        ),
      ],
    );
  }
}

class ErrorMessage extends ChatMessage {
  const ErrorMessage({super.key, required super.text});

  @override
  Widget build(BuildContext context) {
    final ThemeData theme = Theme.of(context);

    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Container(
          margin: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
          padding: const EdgeInsets.all(10.0),
          decoration: BoxDecoration(
            color: theme.colorScheme.errorContainer,
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(0.0),
              topRight: Radius.circular(8.0),
              bottomLeft: Radius.circular(8.0),
              bottomRight: Radius.circular(8.0),
            ),
          ),
          child: Text(
            text,
            style: theme.textTheme.titleMedium,
          ),
        ),
      ],
    );
  }
}

支持的模型

该包支持各种Groq AI模型,包括但不限于:

  • gemma-7b-it
  • llama2-70b-4096
  • 更多模型请参考官方文档获取最新信息

关键方法

  • startChat():初始化新的聊天会话
  • sendMessage(String message):发送消息并接收响应
  • setCustomInstructionsWith(String instructions):为AI设置自定义系统指令
  • clearChat():清除当前聊天上下文

错误处理

此包包含内置的错误处理机制,使用GroqException帮助您优雅地管理API交互中的异常情况。

贡献

欢迎提交Pull Request贡献代码!

免责声明

这是一个社区项目,并非官方产品。


更多关于Flutter数据处理与查询插件groq的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据处理与查询插件groq的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中,使用Groq进行数据处理与查询可以显著提高开发效率和数据操作的灵活性。Groq是一种强大的查询语言,专为处理嵌套和关联数据而设计。虽然Groq本身不是专门为Flutter设计的,但你可以通过一些插件或者网络请求的方式集成Groq到你的Flutter应用中。

以下是一个基本的Flutter应用示例,展示了如何通过HTTP请求使用Groq查询一个假设的数据库(比如Sanity Studio,它支持Groq查询)。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加必要的依赖,比如http包用于发送网络请求。

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保使用最新版本

2. 发送Groq查询请求

接下来,创建一个Dart文件(例如api_service.dart),用于封装HTTP请求和Groq查询。

import 'package:http/http.dart' as http;
import 'dart:convert';

class ApiService {
  private static const String baseUrl = 'https://your-sanity-studio-project-id.cdn.sanity.io/v1/data/query';
  private static const String token = 'your-sanity-studio-read-token';

  Future<dynamic> fetchData(String groqQuery) async {
    var headers = {
      'Authorization': 'Bearer $token',
      'Content-Type': 'application/json',
    };

    var body = jsonEncode({
      'query': groqQuery,
    });

    var response = await http.post(
      Uri.parse(baseUrl),
      headers: headers,
      body: body,
    );

    if (response.statusCode == 200) {
      return jsonDecode(response.body);
    } else {
      throw Exception('Failed to fetch data: ${response.statusCode}');
    }
  }
}

3. 使用Groq查询

在你的Flutter组件中,使用ApiService类来发送Groq查询并处理返回的数据。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GroqQueryScreen(),
    );
  }
}

class GroqQueryScreen extends StatefulWidget {
  @override
  _GroqQueryScreenState createState() => _GroqQueryScreenState();
}

class _GroqQueryScreenState extends State<GroqQueryScreen> {
  List<dynamic> data = [];
  String errorMessage = '';

  @override
  void initState() {
    super.initState();
    fetchGroqData();
  }

  void fetchGroqData() async {
    String groqQuery = '*[_type == "post"]{ title, _id }';
    ApiService apiService = ApiService();

    try {
      var result = await apiService.fetchData(groqQuery);
      setState(() {
        data = result['result'];
        errorMessage = '';
      });
    } catch (e) {
      setState(() {
        errorMessage = e.toString();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Groq Query Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Text(errorMessage, style: TextStyle(color: Colors.red)),
            if (data.isNotEmpty)
              ListView.builder(
                itemCount: data.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(data[index]['title']),
                    subtitle: Text(data[index]['_id']),
                  );
                },
              ),
            else
              Text('Loading...'),
          ],
        ),
      ),
    );
  }
}

总结

以上代码示例展示了如何在Flutter应用中集成Groq查询。通过http包发送POST请求到Sanity Studio的API,并使用Groq查询语言获取数据。你可以根据实际需求调整Groq查询语句,并处理返回的数据。

注意:确保你替换了示例中的baseUrltoken和Groq查询语句,以匹配你的Sanity Studio项目和查询需求。

回到顶部