-
Notifications
You must be signed in to change notification settings - Fork 382
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
perf: add build-in gemini key #282
Conversation
tisfeng
commented
Dec 28, 2023
- 优化了 OpenAI 部分代码,移除了废弃的 completions 请求代码。
- 添加一个默认的 OpenAI APIKey,默认模型为 gemini-pro。
目前 Google 的 Gemini API 免费,实测下来翻译效果不错,由于项目对 Gemini 支持 #270 (comment) 还在开发中,可能需要一点时间,因此我添加了一个内置的 key, 方便用户直接使用 Gemini 模型来翻译。 开源项目 one-api 可以将第三方的大模型接口转换为标准的 OpenAI 接口,这样就能直接在 Easydict 中使用。 我用它在服务器上部署了一个 ,目前支持 OpenAI,Gemini 和智谱 AI, 内置的 key 默认是 Gemini 渠道,debug 模式下可以修改模型为上面三家支持的模型,我简单测试了一下,效果都还可以。 麻烦你们也都测试一下,看看有没有什么问题,可以自己用 one-api 部署测试,或用我的 https://oneapi.izual.me ,或者直接用内置的 key 也行。 |
对了,在开启了 beta 选项,并且没有配置自己的 EZOpenAIAPIKey 时就会使用内置的 key,具体请看代码。 - (NSString *)apiKey {
// easydict://writeKeyValue?EZOpenAIAPIKey=
NSString *apiKey = [[NSUserDefaults standardUserDefaults] stringForKey:EZOpenAIAPIKey] ?: @"";
if (apiKey.length == 0 && EZConfiguration.shared.isBeta) {
apiKey = self.defaultAPIKey;
}
return apiKey;
} |
Swift 代码的话可以拉我 CR 哈,顺便问下这个有考虑用 Swift 吗?是有碰到什么编译问题吗? 如果要重构 |
一开始我想过用 OpenAI 重写目前 OpenAI 部分代码,但发现这类库都使用了 async/await ,会感染导致 override public func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) |
模型转换时,我也试过用 Swift 来写 EZOpenAIChatResponseModel,不想手动解析模型,但在 objc 代码中如果使用 MJExtension 解析 Swift 模型又不方便,需要将属性类型都设置为可选,另外涉及 Int 这种 Swift 专有类型还需要特别处理,就很麻烦。 |
-1. 不用,会自动导入或者你手动标记下,也可以手动加 Continuation 在 Swift 侧 bridge 到 之前的 completion 那套下就行 方案一:
方案二 |
-1. 没有太理解你描述的具体问题是什么,如果有碰到咱们可以case by case过下哈。 我理解 Swift 的 Codable 模型对于简单 case 还是比较方便的,复杂case也提供了足够的可定制性。 或者上游有提供 openapi 文件的话,可以直接用 https://github.com/apple/swift-openapi-generator |
测试 gemini 的这个分支 https://github.com/tisfeng/Easydict/tree/gemini ,我尝试将 testGemini() 内的代码移到上面的 translate 函数中,会有报错,你看一下如何处理。 |
方法在上面说了呀,可以学习了解下 Continuation 哈 方案一: OC 的 如果这里以上两个条件有任一不满足就走方案二 public override func translate(_ text: String, from: Language, to: Language) async throws -> EZQueryResult {
...
} 方案二: 看了下这里比较简单,都不用 Continuation override public func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) {
guard Bool.random() else {
completion(result, nil)
return
}
Task {
do {
let resultString = try await testGemini()
result.translatedText = resultString
completion(result, nil)
} catch {
completion(result, error)
}
}
}
func testGemini() async -> String { "" } Note 自行确保下是 Task {} 还是 Task.detached {},上述代码只作为讲述如何通过编译 |
明白了,看了一下 Continuation 和 Task, 确实可以,学习到了 😃 我顺手也更新了一下 gemini 分支, @Jerry23011 你拉一下代码。 |
你们看一下这个 PR,代码如果没问题,可以先合并了,周末我准备整理一下代码,然后发个新版本。 下周我再用 Swift 重写 OpenAI 这部分代码。 后续的新代码,我们都用 Swift 来写,项目中已有的 objc 代码,我也计划将逐步用 Swift 重写,加快向 Swift 迁移的速度,这会是一个比较漫长的过程,需要大家一起参与 💪 |
来个人 review 过一下。 |
LGTM |
gemini 那边我明天看看👀 |