一次提问,多个AI同时回答
🔥 视频演示: b23.tv/B1OXY2V
Aila:AI超元域桌面应用
欢迎来到 Aila(AI超元域)桌面应用的 GitHub 仓库!这是一款创新的开源软件,它将全球超过20个领先的AI模型集成到一个简洁的桌面应用中,为您提供一个强大的多AI交互平台。无论您是需要头脑风暴、寻求专业建议,还是只是想探索不同AI的思维方式,Aila 都能让您一次提问,收获多元智慧。
功能特性
-
🚀 多AI并行交互:Aila 的核心创新在于,您只需提出一个问题,即可同时从多个AI模型获取回答。告别在多个标签页间切换的繁琐,让思想碰撞的火花在一个屏幕上绽放。
-
🤖 海量AI模型支持:Aila 聚合了全球最受欢迎的AI模型,包括但不限于:
- ChatGPT、Gemini、Claude、Copilot
- Poe、Perplexity、HuggingChat、YouAI
- Gemini Pro 1.5、Together AI、Grok AI、ai playground
- PI AI、Devin AI、Tongyi Qianwen (通义千问)、DouBao AI (豆包)
- ChatGLM、character ai、meta image generator、Suno AI
- (更多模型持续集成中,您也可以通过配置文件自定义添加)
-
🔲 灵活的网格布局:您可以通过设置页面,自由选择屏幕上同时显示的AI回答数量(1、2、3、4或6个)。无论您是想聚焦于某个AI的深度思考,还是想综览全局,都能轻松实现。
-
🖥️ 沉浸式全屏模式:点击任一AI回答卡片右上角的名称,即可将其切换至全屏视图,让您更专注地阅读长篇幅的回答。点击“Home”按钮即可一键返回多视图模式。
-
⚡ 高效的交互设计:
- 快捷指令:在输入框中输入
/可以快速唤起预定义的提示词(Prompts)列表,让您更快地开始对话。 - 持久化指令:在输入开头使用
#可以激活持久化提示词,方便您反复使用同一套指令。 - 灵活提交:除了点击“提交”按钮,您还可以使用
Tab + Enter快捷键来发送问题。 - 一键切换:“切换”按钮让您可以快速在显示的AI模型间循环。
- 快捷指令:在输入框中输入
-
⚙️ 深度自定义:
- 可配置的AI列表:您可以通过左侧的“设置”菜单,在JSON配置文件中自由启用/禁用AI,甚至添加自己发现的新AI模型。
- 个性化提示词:您可以在配置文件中修改或添加新的提示词,打造专属于您的AI助手团队。
- 开箱即用:应用首次启动时会自动生成默认配置文件,并内置了主流AI的交互脚本。
安装指南
系统要求
- Windows: Windows 10 / 11,需安装 .NET 8 SDK。
- macOS: macOS 10.15 (Catalina) 或更高版本。
下载与安装步骤
- 获取安装包:从项目的 Releases 页面下载适用于您操作系统的最新版本。
- Windows 安装:
- 请先确保您的系统已安装 .NET 8 运行时或SDK。
- 根据提示安装提供的证书(这是应用签名的正常流程,请放心操作)。
- 双击下载的
.exe文件,按照安装向导的指示完成安装。
- macOS 安装:
- 双击下载的
.dmg或.pkg文件。 - 将应用图标拖拽至“应用程序”文件夹。
- 首次打开时,可能需要在“系统偏好设置” -> “安全性与隐私”中允许打开来自未知开发者的应用。
- 双击下载的
使用说明
基础使用示例
启动 Aila 后,您将看到一个由多个Web视图组成的网格。底部的输入框是您与所有AI对话的起点。
// 这是在 MainPage.xaml.cs 中处理用户输入的逻辑片段
// 它展示了如何捕获输入并准备发送给多个AI
// 编辑器控件,用于用户输入问题
private Editor _editor = new Editor
{
Placeholder = "👉👉👉在这里输入您的问题。使用 '/' 来调用提示词命令,使用 '#' 来激活持久化命令。按 Tab + Enter 提交。",
// ... 其他配置
};
// 当用户点击提交按钮或按下快捷键时,会触发此逻辑
private async void OnSubmitButtonClicked(object sender, EventArgs e)
{
string userQuery = _editor.Text;
if (string.IsNullOrWhiteSpace(userQuery)) return;
// 这里会遍历当前激活的WebView,并向每个AI注入JavaScript脚本以提交问题
foreach (var webViewInfo in _webViewsInfo)
{
// 获取该WebView对应的AI配置和JavaScript脚本
string script = GetScriptForWebView(webViewInfo.Key).Replace("[message]", userQuery);
// 在WebView中执行JavaScript,模拟用户输入并发送
await webViewInfo.Key.EvaluateJavaScriptAsync(script);
}
// 清空输入框,准备下一个问题
_editor.Text = string.Empty;
}
典型使用场景
- 创意生成与对比:输入“给我三个关于环保的创业点子”,然后欣赏ChatGPT的创意、Claude的逻辑性和Gemini的全面性如何为你提供多维度的建议。
- 代码审查与优化:贴上一段代码并询问“这段代码有什么问题?如何优化?”,不同AI会从性能、安全性和可读性等不同角度给出建议。
- 学习与翻译:同时开启支持多语言的AI(如Gemini和ChatGPT),输入一段复杂的外文文献,对比它们的翻译结果和解释,加深理解。
API 概览 (核心配置)
Aila 的灵活性主要源于其强大的配置系统。您可以通过编辑应用数据目录下的 config.txt 文件来深度定制。
-
AiConfig:定义了每个AI模型的实体。Id: 唯一标识符。Name: 显示在界面上的AI名称。Url: AI对话页面的URL。Script: 用于自动填充问题并提交的JavaScript脚本。脚本中的[message]会被您输入的实际内容替换。IniScript: 初始化脚本,用于在页面加载时执行一些准备工作。
{ "id": 1, "name": "ChatGPT", "url": "https://chat.openai.com/", "script": "(function() { var textarea = document.querySelector('textarea'); textarea.value = '[message]'; textarea.dispatchEvent(new Event('input', {bubbles: true})); setTimeout(function() { var sendButton = document.querySelector('[data-testid=\"send-button\"]'); if (sendButton) sendButton.click(); }, 1000); })();", "iniScript": "" } -
ViewsCount: 控制主界面显示的AI数量(VCount)。 -
Prompts: 定义快捷提示词。当您在输入框键入/时,会列出这里定义的标题。{ "Id": 1, "Title": "翻译成英文", "Prompt": "请将以下内容翻译成英文:" }
核心代码解析
以下是项目中几个核心类的简化代码,带您了解其工作原理。
1. 配置加载与管理 (ConfigurationManager.cs)
该类负责在应用启动时初始化默认的配置文件。
namespace Aila;
public class ConfigurationManager
{
// 委托,用于在需要时从UI线程显示弹窗
public delegate Task DisplayAlertDelegate(string title, string message, string cancel);
public DisplayAlertDelegate OnDisplayAlertRequested;
// 初始化默认配置(如果配置文件不存在)
public async Task InitializeDefaultConfigurationAsync()
{
var filePath = Path.Combine(FileSystem.AppDataDirectory, "config.txt");
if (!File.Exists(filePath))
{
// 默认的JSON内容,包含了所有预置AI的配置
string defaultJson = @"{
""AiConfig"": [ /* ... 多个AI的配置 ... */ ],
""ViewsCount"": { ""VCount"": 4 },
""Prompts"": [ /* ... 默认提示词 ... */ ]
}";
// 将默认配置写入文件
await File.WriteAllTextAsync(filePath, defaultJson);
}
}
}
2. WebView 管理 (WebViewManager.cs)
此类负责高效地管理和复用WebView实例,避免为每个AI重复创建。
namespace Aila;
public class WebViewManager : ContentView
{
// 使用字典缓存已创建的WebView,键为AI的URL
private Dictionary<string, WebView> _webViews = new();
// 获取或创建一个指定URL的WebView
public WebView GetWebViewForUrl(string url)
{
if (!_webViews.ContainsKey(url))
{
var webView = new WebView
{
// 设置UserAgent,模拟桌面浏览器
UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2.1 Safari/605.1.15",
Source = new UrlWebViewSource { Url = url }
};
_webViews[url] = webView;
}
return _webViews[url];
}
// 在指定的WebView中执行JavaScript(例如,提交问题)
public async Task<string> EvaluateJavaScriptAsync(string url, string script)
{
if (_webViews.ContainsKey(url))
{
return await _webViews[url].EvaluateJavaScriptAsync(script);
}
throw new InvalidOperationException("WebView not found.");
}
}
3. 配置编辑与保存 (ConfigPage.xaml.cs)
这个页面为用户提供了一个简单的文本编辑器,用于直接查看和修改 config.txt 文件。
namespace Aila;
public partial class ConfigPage
{
public ConfigPage()
{
InitializeComponent();
}
// 页面出现时,从文件加载配置内容到编辑器
protected override async void OnAppearing()
{
base.OnAppearing();
await InitializeEditorContent();
}
private async Task InitializeEditorContent()
{
string content = await ReadFromFile("config.txt");
editor.Text = content; // editor 是页面上的一个Editor控件
}
// 保存按钮点击事件
private async void OnSaveButtonClicked(object sender, EventArgs e)
{
// 对引号进行规范化处理,避免因中英文引号导致的JSON解析错误
string content = editor.Text.Replace('“', '"').Replace('”', '"');
await WriteToFile("config.txt", content);
await DisplayAlert("成功", "配置已保存。", "OK");
// 发送全局消息,通知应用的其它部分(如MainPage和SettingPage)配置已更新
WeakReferenceMessenger.Default.Send(new ConfigurationUpdatedMessage());
}
// 文件读写辅助方法
private async Task<string> ReadFromFile(string fileName) { /* ... */ }
private async Task WriteToFile(string fileName, string content) { /* ... */ }
}
```FINISHED
SNf5VVuO5xbAiFUGaHFnM31jLWGihNdb0V9PQChNsLU=