在V50版本中,ChatWindow支持使用表达式来自定义快捷操作(使用ChatWindow对象访问静态方法和字段),并内置了一些我个人会用到的操作,也欢迎各位在本帖下方分享脚本,相互交流学习😁
下表是HDG整理出来的一些常用字段及方法,供参考:
名称 | 类型 | 说明 |
---|---|---|
win | Window | 主窗口 |
context | ActionExecuteContext | 动作上下文对象 |
eval | EvalContext | 执行表达式的上下文对象 |
meetings | ObservableCollection | 一个会议信息的集合,是用于存储和管理会议数据 |
userInfo | UserInfo | 表示用户信息的对象,包含用户的头像等信息 |
userSettings | UserSettings | 用户的设置信息,包括偏好设置等信息 |
meeting_listbox | ListBox | 一个列表框控件,用于显示会议列表 |
input | TextEditor | 文本编辑器控件,用于输入文本 |
chatViewer | ScrollViewer | 滚动视图控件,用于聊天界面的消息滚动 |
Meeting_Search | SearchBar | 搜索栏,用于搜索会议信息 |
store_search | SearchBar | 搜索栏,用于搜索角色 |
hotkey | HotKeySetting | 快捷键设置,用于配置内置快捷键 |
meeting_listbox_menu | ContextMenu | 上下文菜单,会议列表框的右键菜单,包含删除话会等菜单项 |
action | ActionItem | ChatWindow的ActionItem对象 |
SwitchBlock | TabControl | 选项卡控件,用于切换主视图(聊天界面、角色商店等) |
SettingTab | TabControl | 设置选项卡,用于切换配置视图(动作信息、设置界面等) |
Tab_bar | ListBox | 标签栏,用于导航不同的视图 |
textArea | TextArea | 文本区域控件,input的TextArea |
completionWindow | CompletionWindow | 补全窗口,用于常用语补全 |
chatCompleteSetting | ChatCompleteSetting | 常用语设置,用于配置常用语的相关设置 |
ChatCompleteData_ListBox | ListBox | 列表框,可能用于显示聊天自动完成数据 |
chatContainer | ItemsControl | 对话容器,由于展示对话 |
cts | CancellationTokenSource | 请求服务的取消令牌源 |
HideMeetingBtn | ToggleButton | 切换按钮,可能用于隐藏或显示话会选择区域 |
OldActionVersion | int | 整数,表示旧的动作版本号 |
CurrentActionVersion | int | 整数,表示当前的动作版本号 |
名称 | 返回类型 | 方法签名 | 说明 |
---|---|---|---|
AddText | void | (string text) | 向聊天输入框添加文本 |
ShowCompletionWindow | void | () | 显示自动补全窗口 |
AddCompleteData | void | (ChatCompleteData data) | 向自动补全窗口添加数据 |
OnButtonClicked | bool | (string name, object tag = null, Window rwin = null, IDictionary<string, object> winData = null, ICustomWindowContext winContext = null) | 按钮点击事件处理,执行相应操作,可以传入的name来执行对应的操作 |
KeyClear | void | (OperationScript script) | 清除快捷键信息 |
EditScript | void | (OperationScript script) | 设置脚本编辑状态 |
RemoveScript | void | (OperationScript script) | 从脚本列表中移除指定脚本 |
AddScript | void | (OperationScript main, string script = "", Hotkey key = null) | 添加新脚本到脚本列表 |
ExpressionToStep | void | (string expression) | 将表达式转换为步骤并复制到剪贴板 |
AddAPIServe | void | (APIServe Data) | 添加新的API服务信息 |
AddChatCompleteData | void | (ChatCompleteData Data) | 添加新的补全数据 |
RemoveAPIServe | void | (APIServe Data) | 从服务列表中移除API服务 |
RemoveChatCompleteData | void | (ChatCompleteData Data) | 从补全数据列表中移除指定数据 |
ChangChar | void | () | 更改补全触发字符 |
SaveMeeting | void | (MeetingInfo meet, int index = -1) | 保存会议信息 |
ClearMeetingData | MeetingInfo | (MeetingInfo meet = null, bool showMessage = true, int group = -1) | 清除会议数据 |
Save | void | () | 保存当前会议数据到文件 |
SettingFileExport | void | () | 导出设置信息到文件 |
SettingFileImport | void | () | 从文件导入设置信息 |
AddMeeting | void | (MeetingInfo meeting = null, int index = -1) | 添加新的会议 |
SelectMeet | void | (int index) | 选中特定的会议 |
DeleteMeeting | void | (MeetingInfo meet = null) | 删除特定的会议 |
GetMeeting | MeetingInfo | (int index = -1, bool showError = true) | 获取特定的会议信息 |
Chat | void | (string msg) | 发送聊天消息 |
SendAsyncRequest | void | (string msg, MeetingInfo meeting) | 异步发送聊天请求 |
Copy | T | <T>(T source) | 创建对象的副本 |
GetWinHandle | IntPtr | () | 获取窗口句柄 |
SwitchToNthFromEndTab | void | (int n) | 切换到标签页控件的倒数第n个标签页(从1开始) |
GetWinSize | string | () | 获取窗口的大小信息 |
StrToImg | ImageSource | (string str) | 将字符串转换为ImageSource对象 |
ToChatCompleteDataByStr | ChatCompleteData | (string str) | 将字符串转换为ChatCompleteData对象 |
ToStrByChatCompleteData | string | (ChatCompleteData oldData) | 将ChatCompleteData对象转换为字符串 |
ToCompleteDataList | ObservableCollection<ChatCompleteData> | (string str) | 将字符串转换为ChatCompleteData的集合 |
ToCompleteDataListStr | string | (ObservableCollection<ChatCompleteData> dataList) | 将ChatCompleteData的集合转换为字符串 |
SetSelectedItems | void | (ListBox listBox, IEnumerable<object> selectedItems) | 设置ListBox选定的项目 |
API_SearchRole | ObservableCollection<MeetingInfo> | (string text = "") | 异步搜索角色信息 |
ScrollToItem | void | (ChatData item) | 滚动到指定的聊天项 |
GetHistoryItems | ObservableCollection<Dictionary<string, object>> | (MeetingInfo meeting = null) | 获取历史记录项 |
LineToSpace | string | (string text) | 将字符串中的换行符转换为空白符 |
GetServe | APIServe | (string id) | 通过ID获取API服务信息 |
Show | void | () | 显示窗口,如果最小化则恢复 |
Hide | void | (bool showInTaskBar = true) | 隐藏窗口 |
类型定义:
public class ChatData : INotifyPropertyChanged
{
private string _role;
private string _content;
public string role
{
get { return _role; }
set
{
if (_role != value)
{
_role = value;
OnPropertyChanged(nameof(role));
}
}
}
public string content
{
get { return _content; }
set
{
if (_content != value)
{
_content = value;
OnPropertyChanged(nameof(content));
}
}
}
public ChatData(string content, string role = "user")
{
_content = content;
_role = role;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class MeetingInfo
{
public string Title { get; set; }
public string Desc { get; set; }
public string Icon { get; set; }
public ObservableCollection<ChatData> Data { get; set; }
public ObservableCollection<string> Tags { get; set; } = new ObservableCollection<string>();
public ModelInfo ModelInfo { get; set; }
public string ServeId { get; set; }
public string Id { get; set; }
public MeetingInfo(string title, ObservableCollection<ChatData> data, string icon = "https://files.getquicker.net/_icons/9FD1890C7ACA84ED0E603C5B46F4BC633436E425.png", ModelInfo modelInfo = null, string desc = "")
{
this.Title = title;
this.Desc = desc;
this.Data = data;
this.ModelInfo = modelInfo ?? new ModelInfo();
this.Icon = icon;
if (string.IsNullOrWhiteSpace(this.Id)) this.Id = Guid.NewGuid().ToString();
}
}
public class ModelInfo
{
public string Model { get; set; } = "gpt-3.5-turbo";
public int MaxTokens { get; set; } = 0;
public double Temperature { get; set; } = 0.5;
public int MaxHistory { get; set; } = 4;
public string SystemMessage { get; set; } = "";
}
public class UserInfo
{
public string Avatar { get; set; }
}
public class UserSettings
{
public bool IsLock { get; set; }
public HotKeySetting HotKey { get; set; }
}
public class HotKeySetting
{
public bool UseEnterSend { get; set; } = true;
}
public class ChatCompleteData : ICompletionData
{
public string Text { get; set; } = "";
public object Content { get; set; } = "";
public object Description { get; set; } = "";
public double Priority { get; set; } = 0;
public ObservableCollection<string> Tags { get; set; } = new ObservableCollection<string>();
public ImageSource Image { get; set; } = null;
public string ImgStr { get; set; } = "fa:Regular_Text";
public void Complete(TextArea textArea, ISegment completionSegment, EventArgs insertionRequestEventArgs)
{
int segmentStartOffset = completionSegment.Offset - 1;
int segmentEndOffset = completionSegment.EndOffset;
textArea.Document.Replace(segmentStartOffset, segmentEndOffset - segmentStartOffset, Text);
textArea.Caret.Offset = segmentStartOffset + Text.Length;
}
public ChatCompleteData(string text, object content, string description, ImageSource img, double priority = 0)
{
this.Text = text;
this.Content = content;
this.Description = description;
this.Priority = priority;
this.Image = img;
}
}
public class ChatCompleteSetting
{
public bool IsEnabled { get; set; } = false;
public ObservableCollection<string> TriggerChar { get; set; } = new ObservableCollection<string>();
}
public class APIServe
{
public string Title { get; set; }
public string Description { get; set; }
public string ApiKey { get; set; }
public string ApiUrl { get; set; }
public string Proxy { get; set; }
public ServeType ServeType { get; set; }
public string Id;
public APIServe(string title, string key, string url, string proxy = null, ServeType type = ServeType.ChatGPT)
{
this.Title = title;
this.ApiKey = key;
this.ApiUrl = url;
this.Proxy = proxy;
this.ServeType = type;
this.Id = Guid.NewGuid().ToString();
}
}
public class OperationScript
{
public string Title { get; set; }
public string Description { get; set; }
public string Script { get; set; }
public string KeyData { get; set; }
public string KeyString { get; set; }
public string Id;
public OperationScript(string title, string script, string key, string desc = "")
{
this.Title = title;
this.Script = script;
this.KeyData = key;
this.Id = Guid.NewGuid().ToString();
this.Description = desc;
}
}
public enum ServeType
{
ChatGPT
}
切换上一话会(可循环):
$=var listbox = ChatWindow.meeting_listbox;
if (listbox.SelectedIndex == 0)
{
listbox.SelectedIndex = ChatWindow.meetings.Count() - 1;
}
else
{
listbox.SelectedIndex -= 1;
}
切换下一话会(可循环):
$=var listbox = ChatWindow.meeting_listbox;
if (listbox.SelectedIndex == ChatWindow.meetings.Count() - 1)
{
listbox.SelectedIndex = 0;
}
else
{
listbox.SelectedIndex += 1;
}