using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using LinkToolAddin.client; using LinkToolAddin.host; using LinkToolAddin.host.llm; using LinkToolAddin.host.llm.entity; using LinkToolAddin.message; using LinkToolAddin.resource; using LinkToolAddin.server; using log4net; using log4net.Appender; using log4net.Config; using log4net.Layout; using ModelContextProtocol.Client; using ModelContextProtocol.Protocol.Types; using Newtonsoft.Json; namespace LinkToolAddin.ui.dockpane { /// /// Interaction logic for TestDockpaneView.xaml /// public partial class TestDockpaneView : UserControl//类1 { private static ILog log = LogManager.GetLogger(typeof(TestDockpaneView)); public TestDockpaneView()//构造方法,没有返回参数1 { InitLogger();//初始化日志输出器1 InitializeComponent(); } protected void InitLogger()//要复制代码(到哪去)1 { // 1. 创建控制台输出器(Appender) var consoleAppender = new ConsoleAppender { Layout = new PatternLayout("%date [%thread] %-5level %logger - %message%newline"), Threshold = log4net.Core.Level.Info // 仅输出 Info 及以上级别 }; consoleAppender.ActivateOptions(); // 激活配置 // 2. 创建文件滚动输出器(按大小滚动) var fileAppender = new RollingFileAppender { File = System.IO.Path.Combine("Logs", "linktool_app.log"), // 日志文件路径 AppendToFile = true, // 追加模式 RollingStyle = RollingFileAppender.RollingMode.Size, // 按文件大小滚动 MaxSizeRollBackups = 10, // 保留 10 个历史文件 MaximumFileSize = "1MB", // 单个文件最大 1MB StaticLogFileName = true, // 固定文件名(否则自动追加序号) Layout = new PatternLayout("%date [%thread] %-5level %logger - %message%newline"), Threshold = log4net.Core.Level.Info // 仅输出 Info 及以上级别 }; fileAppender.ActivateOptions(); // 激活配置 // 3. 直接通过 BasicConfigurator 注册 Appender BasicConfigurator.Configure(consoleAppender, fileAppender); log = LogManager.GetLogger(typeof(DialogDockpaneView)); // 测试日志输出 log.Debug("Debug 日志(控制台可见)"); log.Info("Info 日志(控制台和文件可见)"); log.Error("Error 日志(严重问题)"); } public void CallBack(string str,object obj) { log.Info($"CallBack {str}"); } private async void TestServer_OnClick(object sender, RoutedEventArgs e) { log.Info("TestServer Clicked"); ArcGISProMcpServer.TestMcpServer(); } private async void StdioMcp_test()//标准输入输出的MCP测试,复制过去看能不能返回,有没有东西1 { List args = new List(); args.Add("mcp-server-time"); args.Add("--local-timezone=America/New_York"); McpClient stdioMcpClient = new StdioMcpClient("uvx",args); IList tools = await stdioMcpClient.GetToolListAsync(); foreach (McpClientTool tool in tools) { log.Info(tool.JsonSchema.ToString()); } CallToolResponse response = await stdioMcpClient.CallToolAsync("get_current_time", new Dictionary { { "timezone", "America/New_York" } }); log.Info(JsonConvert.SerializeObject(response));//log看有没有东西和报错,实际调试看对应按钮控制台有没有东西1 } private async void SseMcp_test() { SseMcpClient client = new SseMcpClient("https://mcp.amap.com/sse?key=ed418512c94ade8f83d42c37b77d2bb2"); IList tools = await client.GetToolListAsync(); foreach (McpClientTool tool in tools) { log.Info(tool.JsonSchema.ToString()); } } private async void Retrieve_Test() { log.Info("TestServer Clicked"); // string jsonRpcString = @"{""jsonrpc"":""2.0"",""method"":""CallArcGISPro.CallArcGISProTool"",""params"":{""toolName"":""analysis.Buffer"",""toolParams"":""[\""D:/01_Development/02_ArcGIS_Pro_Project/20250319_GisAi/Test.gdb/河流\"",\""D:/01_Development/02_ArcGIS_Pro_Project/20250319_GisAi/Test.gdb/河流buffer\"",\""100\""]""},""id"":1}"; DocDb docDb = new DocDb("sk-db177155677e438f832860e7f4da6afc", DocDb.KnowledgeBase.ArcGISProHelpDoc); string query = "缓冲区"; KnowledgeResult knowledgeResult = await docDb.Retrieve(query); log.Info(JsonConvert.SerializeObject(knowledgeResult.ChunkList)); } private async void Request_Bailian_Test() { Llm bailian = new Bailian { api_key = "sk-db177155677e438f832860e7f4da6afc", app_id = "6a77c5a68de64f469b79fcdcde9d5001", }; string reponse = await bailian.SendChatAsync(new LlmJsonContent() { Model = "qwen-max", Messages = new List() { new Message() { Role = "user", Content = "你是谁" } }, Temperature = 0.7, TopP = 1, MaxTokens = 1000, }); log.Info(reponse); } private void TestButton_OnClick(object sender, RoutedEventArgs e) { throw new System.NotImplementedException(); } private void TestWorkflow_OnClick(object sender, RoutedEventArgs e) { Gateway.SendMessage("你好","qwen-max","test.gdb",ShowMessage);//标题名称,模型名称,虚构的gdb的路径,回调1 } public void ShowMessage(MessageListItem msg) { log.Info(msg.content); } } }