maui 调用文心一言开发的聊天APP 3

这篇具有很好参考价值的文章主要介绍了maui 调用文心一言开发的聊天APP 3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要是对代码进行了优化

  1. 上一个版本写死了帐号跟密码 ,这一个帐本有户可以直接设置
  2. 对相关的key以及secret如果设置错时,在聊天中也会返回提示。
  3. 注册帐号时同时也设置了key及secrete
  4. 升级到了net.8.0
  5. 导出APK,上一个版本是导出abb.
  6. 解决了变型问题,现在生成桌面系统也能正常显示。

注册界面

maui 调用文心一言开发的聊天APP 3,net 开发,android,typescript,c#

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AiChat.Views.RegPage"
             Shell.NavBarIsVisible="True"
             xmlns:mct="clr-namespace:CommunityToolkit.Maui.Behaviors;assembly=CommunityToolkit.Maui"
             xmlns:local="clr-namespace:AiChat.Views;assembly=AiChat"
             Title="注册">
    <Grid RowDefinitions="Auto,*" Margin="0,10,0,0">
        <VerticalStackLayout Padding="10" VerticalOptions="Center" HorizontalOptions="FillAndExpand">

            <Frame BorderColor="White"
                   CornerRadius="10"
                   HasShadow="True"
                   Margin="0,20,0,0"
                   ZIndex="0"
                   Padding="8">
                <Frame.Shadow>
                    <Shadow Brush="Black"
                            Offset="20,20"
                            Radius="10"
                            Opacity="0.9" />
                </Frame.Shadow>
                <StackLayout Padding="10">
                    <VerticalStackLayout Padding="10" BackgroundColor="{StaticResource White}">
                    
                        <Label Text="AI CHAT"
                               FontSize="30"
                               FontAttributes="Bold"
                               TextColor="{StaticResource Cyan100Accent}"
                               FontFamily="Consolas"
                               Padding="5"/>
                        <Label Text="to continue!" TextColor="{StaticResource Cyan100Accent}"
                               FontSize="14" Padding="5"
                               FontAttributes="Bold" />
                    </VerticalStackLayout>
                    <VerticalStackLayout Padding="10">
                        <Label FontFamily="Consolas" Text="手机号" TextColor="{StaticResource Cyan100Accent}" />
                        <Frame CornerRadius="10" Padding="3" Margin="0,10,0,0">
                            <VerticalStackLayout>
                                <Entry x:Name="Phone" Text="{Binding Phone,Mode=TwoWay}" Margin="5,0,0,0" Placeholder="手机" FontSize="14">
                                    <Entry.Behaviors>
                                        <local:PhoneNumberValidatorBehavior />
                                    </Entry.Behaviors>
                                </Entry>

                            </VerticalStackLayout>
                        </Frame>
                        <VerticalStackLayout Padding="0" Margin="0,5,0,0">
                            <Label FontFamily="Consolas" Text="密码" TextColor="{StaticResource Cyan100Accent}"  />
                            <Frame CornerRadius="10" Padding="3" Margin="0,10,0,0">
                                <Entry x:Name="Password" Text="{Binding Password,Mode=TwoWay}" Margin="5,0,0,0" Placeholder="密码6位数字" IsPassword="True" FontSize="14">
                                    <Entry.Behaviors>
                                        <local:PasswordValidatorBehavior />
                                    </Entry.Behaviors>
                                </Entry>
                            </Frame>
                        </VerticalStackLayout>
                        <Label FontFamily="Consolas" Text="文心一言API_KEY" TextColor="{StaticResource Cyan100Accent}" />
                        <Frame CornerRadius="10" Padding="3" Margin="0,10,0,0">
                            <VerticalStackLayout>
                                <Entry x:Name="API_KEY" Text="{Binding API_KEY,Mode=TwoWay}" Margin="5,0,0,0" Placeholder="API_KEY" FontSize="14" />
                            </VerticalStackLayout>
                        </Frame>
                        <Label FontFamily="Consolas" Text="文心一言SECRET_KEY" TextColor="{StaticResource Cyan100Accent}" />
                        <Frame CornerRadius="10" Padding="3" Margin="0,10,0,0">
                            <VerticalStackLayout>
                                <Entry x:Name="SECRET_KEY" Text="{Binding SECRET_KEY,Mode=TwoWay}" Margin="5,0,0,0" Placeholder="SECRET_KEY" FontSize="14" />
                            </VerticalStackLayout>
                        </Frame>
                        <Button Margin="0,20,0,0"
                                x:Name="RegButton"
                                Clicked="RegButton_Clicked"
                                Text="确定注册" VerticalOptions="CenterAndExpand" BackgroundColor="{StaticResource Cyan100Accent}" 
                                HorizontalOptions="FillAndExpand"/>

                        <BoxView Color="{StaticResource Cyan100Accent}"
                                 Margin="0,20,0,0"
                                 HeightRequest="2"
                                 HorizontalOptions="Fill" />
                        <Grid Padding="10" Margin="0,10,0,0" InputTransparent="False">

                            <Label FontFamily="Consolas"  InputTransparent="False">
                                <Label.FormattedText>
                                    <FormattedString>
                                        <Span Text="返回 " TextColor="{StaticResource Cyan100Accent}" />
                                        <Span Text="登陆" TextColor="{StaticResource Cyan100Accent}" />
                                    </FormattedString>
                                </Label.FormattedText>
                                <Label.GestureRecognizers>
                                    <TapGestureRecognizer Tapped="OnLoginLabelTapped" />
                                </Label.GestureRecognizers>
                            </Label>
                            
                            
                        </Grid>
                        <Grid Padding="10" Margin="0,10,0,0" InputTransparent="False">

                            <Label FontFamily="Consolas"  InputTransparent="False">
                                <Label.FormattedText>
                                    <FormattedString>
                                        <Span Text="百度文言一心登陆获取 API_KEY SECRET_KEY" TextColor="Red" />
                                   
                                    </FormattedString>
                                </Label.FormattedText>
                                <Label.GestureRecognizers>
                                    <TapGestureRecognizer Tapped="OnBaiduLabelTapped" />
                                </Label.GestureRecognizers>
                            </Label>


                        </Grid>
                    </VerticalStackLayout>
                </StackLayout>
            </Frame>
        </VerticalStackLayout>
    </Grid>
</ContentPage>

using System.Text.RegularExpressions;
using System.Windows.Input;
using static Microsoft.Maui.ApplicationModel.Permissions;
namespace AiChat.Views
{
    public class PhoneNumberValidatorBehavior : Behavior<Entry>
    {
        protected override void OnAttachedTo(Entry entry)
        {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        }
        protected override void OnDetachingFrom(Entry entry)
        {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }
        private void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            if (!(sender is Entry entry))
                return;

            string phoneNumber = args.NewTextValue;
            bool isValid = Regex.IsMatch(phoneNumber, @"^\d{11}$");

            // Set IsValid property on the associated entry
            entry.SetValue(IsValidProperty, isValid);
        }

        public static readonly BindableProperty IsValidProperty =
            BindableProperty.CreateAttached("IsValid", typeof(bool), typeof(PhoneNumberValidatorBehavior), false);
    }

    public class PasswordValidatorBehavior : Behavior<Entry>
    {
        protected override void OnAttachedTo(Entry entry)
        {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        }
        protected override void OnDetachingFrom(Entry entry)
        {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }
        private void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            if (!(sender is Entry entry))
                return;

            string password = args.NewTextValue;
            bool isValid = Regex.IsMatch(password, @"^\d{6}$");

            // Set IsValid property on the associated entry
            entry.SetValue(IsValidProperty, isValid);
        }

        public static readonly BindableProperty IsValidProperty =
            BindableProperty.CreateAttached("IsValid", typeof(bool), typeof(PasswordValidatorBehavior), false);
    }
    public partial class RegPage : ContentPage
    {
        public RegPage()
        {
            InitializeComponent();
            BindingContext = this;
        }
        private async void OnLoginLabelTapped(object sender, EventArgs e)
        {
            var nextPage = new LoginPage();
            var navigation = Application.Current.MainPage.Navigation;
            await navigation.PushAsync(nextPage);
        }

        private async void OnBaiduLabelTapped(object sender, EventArgs e)
        {
            await Launcher.TryOpenAsync(new Uri("https://login.bce.baidu.com/"));
        }
        protected override bool OnBackButtonPressed()
        {
            Application.Current.Quit();
            return true;
        }
        private async void RegButton_Clicked(object sender, EventArgs e)
        {
            bool isPhoneValid = (bool)Phone.GetValue(PhoneNumberValidatorBehavior.IsValidProperty);
            bool isPasswordValid = (bool)Password.GetValue(PasswordValidatorBehavior.IsValidProperty);
            if (isPhoneValid && isPasswordValid)
            {
                if (string.IsNullOrEmpty(API_KEY.Text) || string.IsNullOrEmpty(SECRET_KEY.Text))
                {
                    await DisplayAlert("确定", "API_KEY  SECRET_KEY 不能为空?", "确定"); // 修改按钮标签为 "确定"
                    return;
                }

                if (await DisplayAlert("确定", "确定增加吗?", "确定", "取消")) // 修改按钮标签为 "确定" 和 "取消"
                {

                    await SecureStorage.SetAsync("PHONE", Phone.Text);
                    await SecureStorage.SetAsync("PASSWORD", Password.Text);
                    await SecureStorage.SetAsync("API_KEY", API_KEY.Text);
                    await SecureStorage.SetAsync("SECRET_KEY", SECRET_KEY.Text);
                    await DisplayAlert("成功", "注册成功", "OK");
                }

            }
            else
            {
                await DisplayAlert("验证失改", "手机号密码错", "OK");
              
            }
        }


    }
}

加入了手机号密码的验证,同时要求加入API_KEY,SECRET_KEY。

聊天代码

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace AiChat.Views
{
    // 用于将文本颜色转换为视图颜色的转换器
    public class MessageColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // 根据“IsUser”的值确定文本颜色的逻辑
            bool isUser = (bool)value;

            if (isUser)
            {
                // 返回用户的文本颜色
                return Color.FromHex("#0000FF"); // 更改为所需的颜色
            }
            else
            {
                // 返回其他情况的文本颜色
                return Color.FromHex("#000000");// 更改为所需的颜色
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // 如果需要双向绑定,请实现此方法进行转换
            throw new NotImplementedException();
        }
    }

    // 聊天页面类
    public partial class Chat : ContentPage
    {
        // 定义表示聊天消息的类
        public class ChatMessage
        {
            public string Text { get; set; }
            public bool IsUser { get; set; }
            public DateTime Timestamp { get; set; }
        }
        static string sAPI_KEY = "";
        static string sSECRET_KEY = "";
  
        // 用于存储聊天消息的集合
        private ObservableCollection<ChatMessage> chatMessages = new ObservableCollection<ChatMessage>();

        // 构造函数
        public Chat()
        {
            InitializeComponent();
            // 将chatMessages集合绑定到CollectionView的ItemsSource
            collectionView.ItemsSource = chatMessages;
            SetStoredValues();
        }
        // 获取 API_KEY SECRET_KEY
        private async void SetStoredValues()
        {
            var storedKey = await SecureStorage.GetAsync("API_KEY");
      
            if (!string.IsNullOrEmpty(storedKey))
            {
                sAPI_KEY = storedKey;

            }

            var storedSecret = await SecureStorage.GetAsync("SECRET_KEY");
            if (!string.IsNullOrEmpty(storedSecret))
            {
                sSECRET_KEY = storedSecret;
            }
            entryUserMessage.Text = "";
        }
        // 发送消息按钮点击事件处理程序
        private async void SendMessage_Clicked(object sender, EventArgs e)
        {
          
            try
            {
                sendmessageButton.IsEnabled = false;
                loadingIndicator.IsVisible = true;
                // 从Entry中获取用户的消息
                string userMessage = entryUserMessage.Text;
            if (string.IsNullOrEmpty(userMessage) )
            { return;   }

            // 将用户的消息添加到chatMessages集合,并添加时间戳
            chatMessages.Add(new ChatMessage
            {
                Text = $"您:{userMessage}",
                IsUser = true,
                Timestamp = DateTime.Now
            });

            // 模拟对方的响应
            string response = await getAnswer(userMessage);
            response = response != null ? response : "请配置好文心一言的API_KEY SECRET_KEY";

                // 将对方的响应添加到chatMessages集合,并添加时间戳
                chatMessages.Add(new ChatMessage
                {

                Text = $"AI:{response}",
                    IsUser = false,
                    Timestamp = DateTime.Now
                }); 

            // 可选:滚动到底部以显示最新的消息
            collectionView.ScrollTo(chatMessages[chatMessages.Count - 1], ScrollToPosition.End);
            // 发送后清除用户的输入
            entryUserMessage.Text = string.Empty;

            }
       
            finally
            {
                // Hide the loading indicator when the operation is complete
                loadingIndicator.IsVisible = false;
                sendmessageButton.IsEnabled = true;
            }
        }

        public static async Task<string> getAnswer(string question)
        {
            var url = $"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/aquilachat_7b?access_token={await GetAccessToken()}";

            var payload = JsonConvert.SerializeObject(new
            {
                messages = new[]
                {
                    new { role = "user", content = question }
                }
            });

            using (var client = new HttpClient())
            {
                var content = new StringContent(payload, Encoding.UTF8, "application/json");
                var response = await client.PostAsync(url, content);

                if (response.IsSuccessStatusCode)
                {
                    var responseContent = await response.Content.ReadAsStringAsync();
                    var dictObj = JsonConvert.DeserializeObject<dynamic>(responseContent);
                    return dictObj.result;
                }
                else
                {
                    Console.WriteLine($"HTTP请求失败: {response.StatusCode}");
                    return "请配置好文心一言的API_KEY SECRET_KEY";
                }
            }
        }

        private static async Task<string> GetAccessToken()
        {
            var url = "https://aip.baidubce.com/oauth/2.0/token";
            using (var client = new HttpClient())
            {
                var parameters = new FormUrlEncodedContent(new[]
                {
                            new KeyValuePair<string, string>("grant_type", "client_credentials"),
                            new KeyValuePair<string, string>("client_id", sAPI_KEY),
                            new KeyValuePair<string, string>("client_secret", sSECRET_KEY)
                        });
                var response = await client.PostAsync(url, parameters);
                if (response.IsSuccessStatusCode)
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var result = JsonConvert.DeserializeObject<dynamic>(content);
                    return result.access_token;
                }
                else
                {
                    Console.WriteLine($"HTTP请求失败: {response.StatusCode}");
                    return "wrong";
                }
            }
        }
    }
}

桌面界面:

maui 调用文心一言开发的聊天APP 3,net 开发,android,typescript,c#

maui 调用文心一言开发的聊天APP 3,net 开发,android,typescript,c#
maui 调用文心一言开发的聊天APP 3,net 开发,android,typescript,c#文章来源地址https://www.toymoban.com/news/detail-772895.html

到了这里,关于maui 调用文心一言开发的聊天APP 3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 百度文心一言(千帆大模型)聊天API使用指导

    开篇不得不吐槽下百度,百度智能云平台首页跳转千帆大模型平台的按钮太多了,不同按钮跳转不同的子页面,不熟悉的,能把人找懵。入口太多,就导致用户不知道从何开始。本文就从一个前端开发人员的角度,教大家快速使用上文心一言(千帆大模型)API。 直接进千帆控

    2024年02月04日
    浏览(44)
  • 百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧

    原创 | 文 BFT机器人  百度不愧是我国AI技术领域的先行者,每年致力于人工智能领域取得技术产品的突破和创新。据爆料称,百度的文心一言有突破了新境界,开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化,百度都是争先走在最前面,生怕错过大模型的风口。

    2024年02月04日
    浏览(58)
  • springboot + websocket对接文心一言接口实现简单上下文聊天(贴代码)

    如题,第一次用websocket,做了个这玩意,只做了上下文的聊天,没做流式。 中间还有个低级报错但卡了好久,具体可以看【错误记录】websocket连接失败,但后端毫无反应,还有【错误记录】ruoyi-vue@Autowired注入自定义mapper时为null解决 ,感兴趣可前往观看。 实际上我后端用的

    2024年02月07日
    浏览(53)
  • 文心一言:百度止颓的救星,中国自主研发的聊天机器人

    随着人工智能技术的不断发展,聊天机器人作为一种智能化服务方式,受到了越来越多企业和个人的关注和使用。在这个领域中,国内的百度推出了一款聊天机器人——文心一言。它采用了自然语言处理技术和深度学习算法,实现了人机对话、知识问答、场景交互等多种功能

    2024年02月14日
    浏览(41)
  • Python调用文心一言的API

    最近申请了文心一言的key,然后尝试调用了一下文心一言,这里使用一个简单的方式来调用文心一言: 然后就可以开开心心的使用文心一言的API了。 文心千帆

    2024年02月11日
    浏览(42)
  • AI聊天机器人,一个就够了:文心一言、讯飞星火、通义千问AI聊天机器人深度对比(一)

    本次为第一部分的测评,综合结论: 讯飞星火 文心一言 = 通义千问 。 文本生成能力:文心一言 = 讯飞星火 通义千问,讯飞星火表现亮眼,文心一言作为国内AI聊天机器人的先发者,在创意写作方面略不尽如人意。 代码能力:文心一言 = 讯飞星火 = 通义千问。对于不是很复

    2024年02月02日
    浏览(55)
  • AI聊天机器人,一个就够了:文心一言、讯飞星火、通义千问AI聊天机器人深度对比(二)

    本次为第二部分的测评,第一部分的测评请点击这里。综合结论: :通义千问 讯飞星火 文心一言 。 逻辑推理能力:讯飞星火 = 通义千问 文心一言。对于基本的逻辑推理问题,三个AI聊天机器人都能通过测试。但对于稍高难度的逻辑推理问题,讯飞星火和通义千问的表现亮

    2024年02月01日
    浏览(65)
  • 文心一言App使用教程图解

    大家好,小发猫降ai今天来聊聊文心一言App使用教程图解,希望能给大家提供一点参考。降ai辅写 以下是针对论文AI辅写率高的情况,提供一些修改建议和技巧,可以借助此类工具: 还有: 文心一言App使用教程图解 在数字化浪潮中,我们拥抱了众多便捷的智能工具,其中文心

    2024年04月13日
    浏览(45)
  • 文心一言API调用,保姆级案例分享

    分享一个调用文心一言API的案例。今天自己用程序去过去文心一言模型中获取结果。 官方给送了20块钱的体验券! 后续收费规则如下 api调用需要先在千帆平台开通API key 。这里根据教程中一步一步操作即可开通成功。 文心一言API使用教程(python版) - 百度智能云千帆社区

    2024年01月24日
    浏览(39)
  • java调用文心一言API的方法

    话不多说,直接上干货: 一、首先去官网注册一个账号百度智能云-登录 (baidu.com),注册完成后等待审核,审核后就可以去控制台操作啦! 二、根据官网介绍,由于文心一言属于收费产品(也有免费的,但功能限制),因此建议可以充值几块钱,足以做实验用了。我这里用的

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包