Flutter Agent Pupau
A Flutter plugin that integrates a Pupau agent in your application.
Features
- AI-Powered Chat Interface - Full-featured chat UI with streaming responses
- Multiple Widget Modes - Full screen, sized container, or floating overlay
- Flexible Authentication - API key or bearer token authentication
- Event Streaming - Real-time events for conversation lifecycle
- Multi-language Support - Built-in support for 14 languages
- Programmatic Control - Open, reset, and load conversations via code
Installation
Add this to your package's pubspec.yaml file:
dependencies:
flutter_agent_pupau:
git:
url: https://github.com/gluelabs/flutter_agent_pupau.git
Then run:
flutter pub get
Usage
1. Import the Package
import 'package:flutter_agent_pupau/flutter_agent_pupau.dart';
Configuration
Create a configuration using one of two authentication methods:
Option A: API Key Authentication
The assistant ID is automatically extracted from the API key.
final config = PupauConfig.createWithApiKey(
apiKey: 'your-api-key',
// Optional parameters
conversationId: 'existing-conversation-id', // Load specific conversation
isAnonymous: false, // Anonymous chat mode
language: 'en', // UI language (en, es, fr, de, etc.)
googleMapsApiKey: 'your-maps-key', // For location features
hideInputBox: false, // Hide the input field
widgetMode: WidgetMode.full, // Display mode
showNerdStats: false, // Show token/credit stats
conversationStarters: [ // Predefined starter messages
'Tell me about your features',
'How can you help me?',
],
customProperties: { // Custom metadata
'userId': '123',
'source': 'mobile_app',
},
);
Option B: Bearer Token Authentication
Requires explicit assistant ID.
final config = PupauConfig.createWithToken(
bearerToken: 'your-bearer-token',
assistantId: 'your-assistant-id',
isMarketplace: false, // Set to true if it's a Pupau marketplace agent
// ... same optional parameters as above
);
Widget Avatar
The PupauAgentAvatar widget is the main UI component that displays an avatar and handles chat interactions. It supports three display modes:
Full Screen Mode (Default)
On tap it navigates to a full page that displays the chat.
PupauAgentAvatar(
config: PupauConfig.createWithApiKey(
apiKey: 'your-api-key',
widgetMode: WidgetMode.full,
),
)
Sized Mode
The avatar expands in-place to a specified width and height.
PupauAgentAvatar(
config: PupauConfig.createWithApiKey(
apiKey: 'your-api-key',
widgetMode: WidgetMode.sized,
sizedConfig: SizedConfig(
width: 400,
height: 600,
initiallyExpanded: false, // Start collapsed
),
),
)
Floating Overlay Mode
The chat appears as a floating overlay anchored to the avatar.
PupauAgentAvatar(
config: PupauConfig.createWithApiKey(
apiKey: 'your-api-key',
widgetMode: WidgetMode.floating,
floatingConfig: FloatingConfig(
width: 400,
height: 600,
anchor: FloatingAnchor.bottomRight, // bottomRight, bottomLeft, topRight, topLeft
),
),
)
Initially Expanded Chat**
If you want the chat to be already expanded when the widget first loads, use the sized mode with initiallyExpanded: true:
PupauAgentAvatar(
config: PupauConfig.createWithApiKey(
apiKey: 'your-api-key',
widgetMode: WidgetMode.sized,
sizedConfig: SizedConfig(
width: 400,
height: 600,
initiallyExpanded: true, //Chat starts expanded!
),
),
)
Programmatic Control with PupauChatUtils
Control the chat programmatically from anywhere in your app:
Open Chat from Code
// Open chat with a button press
ElevatedButton(
onPressed: () {
PupauChatUtils.openChat(
context,
PupauConfig.createWithApiKey(apiKey: 'your-api-key'),
);
},
child: Text('Open Chat'),
)
Reset Current Chat
// Clear the current conversation and start fresh
await PupauChatUtils.resetChat();
Load Specific Conversation
// Load a conversation by ID
await PupauChatUtils.loadConversation('conversation-id');
Event Streaming with PupauEventService
Listen to real-time events from the chat interface:
Basic Event Listening
import 'package:flutter_agent_pupau/flutter_agent_pupau.dart';
// Listen to all chat events
PupauEventService.pupauStream.listen((event) {
print('Event Type: ${event.type}');
print('Event Payload: ${event.payload}');
switch (event.type) {
case UpdateConversationType.newConversation:
print('New conversation created: ${event.payload}');
break;
case UpdateConversationType.messageSent:
print('Message sent: ${event.payload}');
break;
case UpdateConversationType.messageReceived:
print('Message received: ${event.payload}');
break;
case UpdateConversationType.conversationChanged:
print('Conversation changed to: ${event.payload}');
break;
case UpdateConversationType.error:
print('Error occurred: ${event.payload}');
break;
// ... handle other events
}
});
Event Types
| Event Type | Payload | Description |
|---|---|---|
componentBootStatus |
BootState |
Plugin initialization status (off, pending, ok, error) |
newConversation |
String (conversationId) |
New conversation created |
resetConversation |
null |
Conversation was reset |
conversationChanged |
String (conversationId) |
Active conversation changed |
conversationTitleGenerated |
String (title) |
Conversation title generated |
firstMessageComplete |
null |
First message in conversation completed |
messageSent |
Message |
User sent a message |
messageReceived |
Message |
AI response received |
stopMessage |
null |
Message streaming stopped |
deleteConversation |
String (conversationId) |
Conversation deleted |
windowClose |
null |
Chat window closed |
historyToggle |
bool |
Conversation history toggled |
noCredit |
null |
No credits available |
error |
String (error message) |
General error occurred |
authError |
String (error message) |
Authentication error |
tokensPerSecond |
double |
Streaming performance metric |
timeToComplete |
int (milliseconds) |
Time to complete response |
timeToFirstToken |
int (milliseconds) |
Time to first token received |
## Supported Languages
The plugin supports the following language codes for the `language` parameter:
- `en` - English (default)
- `de` - German
- `es` - Spanish
- `fr` - French
- `hi` - Hindi
- `it` - Italian
- `ko` - Korean
- `nl` - Dutch
- `pl` - Polish
- `pt` - Portuguese
- `sq` - Albanian
- `sv` - Swedish
- `tr` - Turkish
- `zh` - Chinese
## License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Libraries
- chat_page/bindings/chat_bindings
- chat_page/components/attachments_elements/attachment_card
- chat_page/components/attachments_elements/attachment_note_modal
- chat_page/components/attachments_elements/attachment_switch_skeleton
- chat_page/components/attachments_elements/attachments_box
- chat_page/components/attachments_elements/attachments_list
- chat_page/components/attachments_elements/attachments_modal
- chat_page/components/attachments_elements/attachments_search_bar
- chat_page/components/attachments_elements/attachments_tokens_info
- chat_page/components/attachments_elements/toggle_attachments_switch
- chat_page/components/chat_elements/assistant_avatar
- chat_page/components/chat_elements/assistant_capabilities
- chat_page/components/chat_elements/assistant_chip
- chat_page/components/chat_elements/assistant_info_modal
- chat_page/components/chat_elements/chat_app_bar
- chat_page/components/chat_elements/chat_image_full
- chat_page/components/chat_elements/chat_image_zoomable
- chat_page/components/chat_elements/chat_input_field
- chat_page/components/chat_elements/chat_loading_message
- chat_page/components/chat_elements/chat_skeleton
- chat_page/components/chat_elements/chat_tools_fab
- chat_page/components/chat_elements/conversation_starter_chip
- chat_page/components/chat_elements/conversation_starters_list
- chat_page/components/chat_elements/conversation_title
- chat_page/components/chat_elements/custom_action_card
- chat_page/components/chat_elements/custom_actions_modal
- chat_page/components/chat_elements/initial_message
- chat_page/components/chat_elements/messages_list
- chat_page/components/chat_elements/my_mention_tag_text_editing_controller
- chat_page/components/chat_elements/my_mention_tag_text_field
- chat_page/components/chat_elements/taggable_assistants_list
- chat_page/components/chat_elements/tagged_assistants_list
- chat_page/components/markdown_builders_elements/code_builder
- chat_page/components/markdown_builders_elements/code_container
- chat_page/components/markdown_builders_elements/download_builder
- chat_page/components/markdown_builders_elements/download_container
- chat_page/components/markdown_builders_elements/download_syntax
- chat_page/components/markdown_builders_elements/google_map_builder
- chat_page/components/markdown_builders_elements/google_map_container
- chat_page/components/markdown_builders_elements/google_map_syntax
- chat_page/components/markdown_builders_elements/link_builder
- chat_page/components/markdown_builders_elements/mermaid_builder
- chat_page/components/markdown_builders_elements/mermaid_container
- chat_page/components/markdown_builders_elements/mermaid_syntax
- chat_page/components/markdown_builders_elements/thinking_builder
- chat_page/components/markdown_builders_elements/thinking_syntax_builder
- chat_page/components/markdown_builders_elements/thinking_tag_container
- chat_page/components/markdown_builders_elements/tool_use_info
- chat_page/components/markdown_builders_elements/tool_use_info_list
- chat_page/components/message_elements/attachments_box
- chat_page/components/message_elements/chat_date_container
- chat_page/components/message_elements/context_info_container
- chat_page/components/message_elements/context_info_item
- chat_page/components/message_elements/fork_conversation_icon
- chat_page/components/message_elements/fork_conversation_modal
- chat_page/components/message_elements/kb_references_modal
- chat_page/components/message_elements/knowledge_base_info
- chat_page/components/message_elements/loading_dots
- chat_page/components/message_elements/loading_tag
- chat_page/components/message_elements/loading_text
- chat_page/components/message_elements/loading_tool_use
- chat_page/components/message_elements/loading_web_search
- chat_page/components/message_elements/message_action_bar
- chat_page/components/message_elements/message_body
- chat_page/components/message_elements/message_bottom_elements
- chat_page/components/message_elements/message_bubble
- chat_page/components/message_elements/message_content
- chat_page/components/message_elements/message_copy_icon
- chat_page/components/message_elements/message_elements
- chat_page/components/message_elements/message_load_error_info
- chat_page/components/message_elements/message_notifier
- chat_page/components/message_elements/message_sender_info
- chat_page/components/message_elements/message_stream_builder
- chat_page/components/message_elements/message_time_info
- chat_page/components/message_elements/prompt_options_list
- chat_page/components/message_elements/reaction_icon
- chat_page/components/message_elements/reference_text
- chat_page/components/message_elements/reflection_tag_container
- chat_page/components/message_elements/text_to_speach_icon
- chat_page/components/message_elements/urls_list
- chat_page/components/message_elements/web_search_type_indicator
- chat_page/components/shared/api_error_widget
- chat_page/components/shared/basic_app_bar
- chat_page/components/shared/close_icon
- chat_page/components/shared/custom_basic_dialog
- chat_page/components/shared/custom_checkbox
- chat_page/components/shared/custom_delete_confirm_dialog
- chat_page/components/shared/custom_info_box
- chat_page/components/shared/custom_input_field
- chat_page/components/shared/custom_search_bar
- chat_page/components/shared/custom_selectable_text
- chat_page/components/shared/custom_switch
- chat_page/components/shared/error_snackbar
- chat_page/components/shared/feedback_snackbar
- chat_page/components/shared/image_not_available_widget
- chat_page/components/shared/info_row
- chat_page/components/shared/marketplace_icon
- chat_page/components/shared/modal_option
- chat_page/components/shared/no_data_found_info
- chat_page/components/shared/selection_transformer
- chat_page/components/shared/setting_denied_dialog
- chat_page/components/tool_use_elements/ask_user_option
- chat_page/components/tool_use_elements/basic_tool_use_modal
- chat_page/components/tool_use_elements/browser_inspector_modal
- chat_page/components/tool_use_elements/browser_use_bottom_info
- chat_page/components/tool_use_elements/browser_use_datalayer_content
- chat_page/components/tool_use_elements/browser_use_datalayer_item
- chat_page/components/tool_use_elements/browser_use_loading_message
- chat_page/components/tool_use_elements/browser_use_network_content
- chat_page/components/tool_use_elements/browser_use_network_item
- chat_page/components/tool_use_elements/document_tool_card
- chat_page/components/tool_use_elements/document_tool_download
- chat_page/components/tool_use_elements/image_generation_tool_modal
- chat_page/components/tool_use_elements/message_ask_user
- chat_page/components/tool_use_elements/message_browser_use
- chat_page/components/tool_use_elements/message_browser_use_loading_placeholder
- chat_page/components/tool_use_elements/message_browser_use_screenshot
- chat_page/components/tool_use_elements/message_document
- chat_page/components/tool_use_elements/message_knowledge_base
- chat_page/components/tool_use_elements/message_thinking
- chat_page/components/tool_use_elements/message_to_do_list
- chat_page/components/tool_use_elements/smtp_info_modal
- chat_page/components/tool_use_elements/todo_item
- chat_page/components/tool_use_elements/tool_use_avatar
- chat_page/components/tool_use_elements/tool_use_bubble
- chat_page/components/tool_use_elements/tool_use_info
- chat_page/components/tool_use_elements/tool_use_info_list
- chat_page/components/tool_use_elements/tool_use_message_content
- chat_page/components/ui_tool_elements/message_request_credentials
- chat_page/components/ui_tool_elements/ui_tool_bubble
- chat_page/components/web_elements/chat_images_list
- chat_page/components/web_elements/graph_info_container
- chat_page/components/web_elements/news_container
- chat_page/components/web_elements/organic_info_container
- chat_page/components/web_elements/organic_info_modal
- chat_page/components/web_elements/source_info
- chat_page/components/web_elements/web_search_elements
- chat_page/components/web_elements/web_search_images_modal
- chat_page/components/web_elements/web_search_news_list
- chat_page/components/web_elements/web_search_news_modal
- chat_page/controllers/assistants_controller
- chat_page/controllers/attachments_controller
- chat_page/controllers/browser_inspector_controller
- chat_page/controllers/chat_controller
- chat_page/controllers/tool_ask_user_controller
- chat_page/pupau_agent_avatar
- chat_page/pupau_agent_chat
- chat_page/utils/modal_utils
- config/pupau_config
- flutter_agent_pupau
- Main library file for flutter_agent_pupau package
- models/ai_model
- models/assistant_api_key_model
- models/assistant_model
- models/attachment_model
- models/chat_image_model
- models/conversation_model
- models/custom_action_model
- models/loading_message_model
- models/prompt_option_model
- models/prompt_reflection_model
- models/pupau_message_model
- models/setting_model
- models/tool_use_message_model
- models/tool_use_models/tool_use_ask_user_data
- models/tool_use_models/tool_use_browser_use_data
- models/tool_use_models/tool_use_document_data
- models/tool_use_models/tool_use_image_generation_data
- models/tool_use_models/tool_use_knowledge_base_data
- models/tool_use_models/tool_use_pipeline_data
- models/tool_use_models/tool_use_s_m_t_p_data
- models/tool_use_models/tool_use_to_do_list_data
- models/tool_use_models/tool_use_web_reader_data
- models/tool_use_models/tool_use_web_search_data
- models/ui_tool_message_model
- pupau_agent
- Public API for flutter_agent_pupau package
- services/api_exceptions
- services/api_service
- services/assistant_service
- services/attachment_service
- services/conversation_service
- services/device_service
- services/file_service
- services/google_drive_service
- services/google_maps_service
- services/json_parse_service
- services/message_service
- services/pupau_event_service
- services/settings_service
- services/sse_service
- services/string_service
- services/style_service
- services/tag_service
- services/tool_ask_user_service
- services/tool_use_service
- services/tts_service
- services/ui_tool_service
- utils/api_urls
- utils/constants
- utils/pupau_chat_utils
- utils/settings
- utils/translations/languages/de_de_translation
- utils/translations/languages/en_us_translation
- utils/translations/languages/es_es_translation
- utils/translations/languages/fr_fr_translation
- utils/translations/languages/hi_in_translation
- utils/translations/languages/it_it_translation
- utils/translations/languages/ko_kr_translation
- utils/translations/languages/nl_nl_translation
- utils/translations/languages/pl_pl_translation
- utils/translations/languages/pt_pt_translation
- utils/translations/languages/sq_al_translation
- utils/translations/languages/sv_se_translation
- utils/translations/languages/tr_tr_translation
- utils/translations/languages/zh_cn_translation
- utils/translations/localization_service
- utils/translations/strings_enum
- utils/translations/theme/anonymous_theme_colors
- utils/translations/theme/dark_theme_colors
- utils/translations/theme/light_theme_colors
- utils/translations/theme/my_fonts
- utils/translations/theme/my_styles
- utils/translations/theme/my_theme
- utils/translations/theme/theme_extensions/pupau_theme_data
- utils/translations/theme/theme_extensions/skeleton_theme_data