Aila:一次提问,与全球顶尖AI同时对话

7 阅读7分钟

一次提问,多个AI同时回答

🔥 视频演示: b23.tv/B1OXY2V

Aila:AI超元域桌面应用

欢迎来到 Aila(AI超元域)桌面应用的 GitHub 仓库!这是一款创新的开源软件,它将全球超过20个领先的AI模型集成到一个简洁的桌面应用中,为您提供一个强大的多AI交互平台。无论您是需要头脑风暴、寻求专业建议,还是只是想探索不同AI的思维方式,Aila 都能让您一次提问,收获多元智慧。

功能特性

  • 🚀 多AI并行交互:Aila 的核心创新在于,您只需提出一个问题,即可同时从多个AI模型获取回答。告别在多个标签页间切换的繁琐,让思想碰撞的火花在一个屏幕上绽放。

  • 🤖 海量AI模型支持:Aila 聚合了全球最受欢迎的AI模型,包括但不限于:

    • ChatGPTGeminiClaudeCopilot
    • PoePerplexityHuggingChatYouAI
    • Gemini Pro 1.5Together AIGrok AIai playground
    • PI AIDevin AITongyi Qianwen (通义千问)DouBao AI (豆包)
    • ChatGLMcharacter aimeta image generatorSuno 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) 或更高版本。

下载与安装步骤

  1. 获取安装包:从项目的 Releases 页面下载适用于您操作系统的最新版本。
  2. Windows 安装
    • 请先确保您的系统已安装 .NET 8 运行时或SDK。
    • 根据提示安装提供的证书(这是应用签名的正常流程,请放心操作)。
    • 双击下载的 .exe 文件,按照安装向导的指示完成安装。
  3. 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;
}

典型使用场景

  1. 创意生成与对比:输入“给我三个关于环保的创业点子”,然后欣赏ChatGPT的创意、Claude的逻辑性和Gemini的全面性如何为你提供多维度的建议。
  2. 代码审查与优化:贴上一段代码并询问“这段代码有什么问题?如何优化?”,不同AI会从性能、安全性和可读性等不同角度给出建议。
  3. 学习与翻译:同时开启支持多语言的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=