87 lines
2.8 KiB
C#
Raw Normal View History

2025-10-11 18:25:59 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XiaoZhiSharp;
using XiaoZhiSharp.Utils;
namespace DuoDuo.Services
{
public class AgentService
{
private readonly XiaoZhiAgent _agent;
private readonly McpService _mcpService;
#region
public XiaoZhiAgent Agent{ get { return _agent; } }
public PageModels.MainPageModel MainPageModel { get; set; } = new PageModels.MainPageModel();
#endregion
public AgentService(McpService mcpService)
{
XiaoZhiSharp.Global.IsMcp = true;
_mcpService = mcpService;
_agent = new XiaoZhiAgent();
_agent.DeviceId = Global.DeviceId;
_agent.OnMessageEvent += Agent_OnMessageEvent;
#if ANDROID
_agent.AudioService = new Services.AndroidAudioService();
#endif
_ = _agent.Start();
_ = Task.Run(async () =>
{
await Task.Delay(5000);
while (true)
{
MainPageModel.StatusMessage = $"连接状态: {_agent.ConnectState}";
if (_agent.ConnectState != System.Net.WebSockets.WebSocketState.Open)
{
await _agent.Restart();
MainPageModel.StatusMessage = $"连接状态: Restart";
await Task.Delay(3000);
}
await Task.Delay(2000);
}
});
}
private async Task Agent_OnMessageEvent(string type, string message)
{
switch (type)
{
case "question":
MainPageModel.QuestionMessae = message;
break;
case "answer":
MainPageModel.AnswerMessae = message;
break;
case "emotion":
MainPageModel.Emotion = message;
break;
case "emotion_text":
MainPageModel.EmotionText = message;
break;
case "answer_stop":
break;
case "audio_start":
MainPageModel.StatusAudio = "说话中...";
break;
case "audio_stop":
MainPageModel.StatusAudio = "";
break;
case "mcp":
string resultMessage = await _mcpService.McpMessageHandle(message);
if(!string.IsNullOrEmpty(resultMessage))
await _agent.McpMessage(resultMessage);
break;
default:
break;
}
}
}
}