Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ Every item below is one more layer sedimented into a default — a capability yo
- **Toggle and push-to-talk** recording modes, plus a **MediaPlayPause trigger** so wired-earbud inline controls can start and stop recording. `Esc` cancels at any phase, including polish and insertion.
- **Cloud ASR**: Volcengine streaming ASR (bigasr), Tencent Cloud Hunyuan realtime ASR (Hy-ASR), iFlytek realtime ASR (RTASR), Alibaba Cloud Bailian (classic realtime / Qwen3 realtime / Fun-ASR-Flash file transcription), StepFun StepAudio (batch + realtime), Zhipu GLM-ASR, Xiaomi MiMo ASR, OrcaRouter audio-input Gemini, ElevenLabs Scribe, OpenAI-compatible batch transcription (OpenAI Whisper / Groq / SiliconFlow SenseVoice / OpenRouter / ZenMux), and Apple Speech (macOS).
- **Local ASR**: bundled Qwen3-ASR (0.6B / 1.7B) via vendored `Open-Less/qwen-asr` (macOS); Windows Foundry Local Whisper and sherpa-onnx (experimental) variants.
- **Polish providers**: Ark (Volcengine), DeepSeek, OpenAI, Google Gemini, Codex OAuth, SiliconFlow, Atlas Cloud, Xiaomi MiMo, Tencent Cloud TokenHub, CometAPI, OpenRouter, OrcaRouter, Alibaba Cloud Coding Plan, CodingPlanX, MiniMax, StepFun, and OpenCode Zen — plus any OpenAI-compatible endpoint you bring.
- **Polish providers**: Ark (Volcengine), DeepSeek, OpenAI, Google Gemini, Codex OAuth, SiliconFlow, Atlas Cloud, Xiaomi MiMo, Tencent Cloud TokenHub, CometAPI, OpenRouter, Requesty, OrcaRouter, Alibaba Cloud Coding Plan, CodingPlanX, MiniMax, StepFun, and OpenCode Zen — plus any OpenAI-compatible endpoint you bring.
- **Four output modes**: raw, light polish, structured (**AI-prompt mode**), and formal. Plus a **translation hotkey** that converts speech directly into the configured target language ([#43](../../issues/43)).
- **Selection-ask QA panel** — a separate hotkey opens a floating panel that runs voice Q&A against the highlighted text in any app ([#118](../../issues/118)).
- **Main window**: Overview / History / Vocab / Style / Marketplace / Settings. Persistent tray icon, plus a mini status capsule that floats on screen and follows the display you are typing on (multi-monitor).
Expand Down
2 changes: 1 addition & 1 deletion README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ OpenLess 只做一件事:**把语音变成可用的书面文字(尤其是 AI 提
- **切换式与按住说话(push-to-talk)** 两种录音模式,外加 **MediaPlayPause 触发**,让有线耳机的线控也能开始 / 停止录音。`Esc` 可在任意阶段取消,包括润色与插入。
- **云端 ASR**:Volcengine 流式 ASR(bigasr)、腾讯云混元实时 ASR(Hy-ASR)、讯飞实时语音转写(RTASR)、阿里云百炼(经典实时 / Qwen3 实时 / Fun-ASR-Flash 录音文件)、阶跃星辰 StepAudio(批式 + 实时)、智谱 GLM-ASR、小米 MiMo ASR、OrcaRouter 音频输入 Gemini、ElevenLabs Scribe、OpenAI 兼容批量转写(OpenAI Whisper / Groq / 硅基流动 SenseVoice / OpenRouter / ZenMux),以及 Apple Speech(macOS)。
- **本地 ASR**:通过 vendored 的 `Open-Less/qwen-asr` 内置 Qwen3-ASR(0.6B / 1.7B)(macOS);Windows 上的 Foundry Local Whisper 与 sherpa-onnx(实验性)变体。
- **润色提供方**:Ark(火山方舟)、DeepSeek、OpenAI、Google Gemini、Codex OAuth、硅基流动、Atlas Cloud、小米 MiMo、腾讯云 TokenHub、CometAPI、OpenRouter、OrcaRouter、阿里云 Coding Plan、CodingPlanX、MiniMax、StepFun、OpenCode Zen,以及你自带的任意 OpenAI 兼容端点。
- **润色提供方**:Ark(火山方舟)、DeepSeek、OpenAI、Google Gemini、Codex OAuth、硅基流动、Atlas Cloud、小米 MiMo、腾讯云 TokenHub、CometAPI、OpenRouter、Requesty、OrcaRouter、阿里云 Coding Plan、CodingPlanX、MiniMax、StepFun、OpenCode Zen,以及你自带的任意 OpenAI 兼容端点。
- **四种输出模式**:原文、轻度润色、结构化(**AI 提示词模式**)、正式。另有一个**翻译快捷键**,将语音直接转换为所配置的目标语言([#43](../../issues/43))。
- **选区问答面板**——一个独立快捷键打开浮动面板,针对任意应用中被高亮选中的文本进行语音问答([#118](../../issues/118))。
- **主窗口**:概览 / 历史 / 词典 / 风格 / 市场 / 设置。常驻托盘图标,以及一个浮于屏幕、并跟随你正在输入的显示器的迷你状态胶囊(多显示器)。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ pub const SHARED_CLOUD_LLM_PROVIDER_TYPES: &[&str] = &[
"mimo",
"cometapi",
"openrouterFree",
"requesty",
"orcarouter",
"alibabaCoding",
"codingPlanX",
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/crates/openless-core/src/polish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ fn is_builtin_llm_provider(provider_id: &str) -> bool {
| "mimo"
| "cometapi"
| "openrouterFree"
| "requesty"
| "orcarouter"
| "alibabaCoding"
| "codingPlanX"
Expand Down
39 changes: 39 additions & 0 deletions openless-all/app/crates/openless-core/src/provider_rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ const LLM_PROVIDER_TYPES: &[(&str, &str)] = &[
("mimo", "mimo"),
("cometapi", "cometapi"),
("openrouterFree", "openrouterFree"),
("requesty", "requesty"),
("orcarouter", "orcarouter"),
("alibabaCoding", "alibabaCoding"),
("codingPlanX", "codingPlanX"),
Expand Down Expand Up @@ -601,6 +602,7 @@ pub fn default_llm_endpoint(provider_type: &str) -> Option<&'static str> {
"mimo" => Some("https://api.xiaomimimo.com/v1"),
"cometapi" => Some("https://api.cometapi.com/v1"),
"openrouterFree" => Some("https://openrouter.ai/api/v1"),
"requesty" => Some("https://router.requesty.ai/v1"),
"orcarouter" => Some(crate::asr::mimo::ORCAROUTER_DEFAULT_ENDPOINT),
"alibabaCoding" => Some("https://coding-intl.dashscope.aliyuncs.com/v1"),
"codingPlanX" => Some("https://api.codingplanx.ai/v1"),
Expand All @@ -623,6 +625,7 @@ pub fn default_llm_model(provider_type: &str) -> Option<&'static str> {
crate::polish::CODEX_OAUTH_PROVIDER_ID => Some(crate::polish::CODEX_DEFAULT_MODEL),
"mimo" => Some("xiaomi/mimo-v2-flash"),
"openrouterFree" => Some("qwen/qwen3-coder:free"),
"requesty" => Some("openai/gpt-4o-mini"),
"orcarouter" => Some("orcarouter/fusion-flash"),
"alibabaCoding" => Some("qwen3-coder-plus"),
"codingPlanX" => Some("gpt-5-mini"),
Expand Down Expand Up @@ -1341,6 +1344,42 @@ mod tests {
assert!(llm_configured("opencode", &configuration));
}

#[test]
fn requesty_descriptor_supplies_defaults_formats_and_credentials() {
use crate::llm_protocol::LlmRequestFormat;
assert!(crate::cloud_providers::SHARED_CLOUD_LLM_PROVIDER_TYPES.contains(&"requesty"));
let descriptor = provider_descriptor(ProviderKind::Llm, "requesty").unwrap();
assert_eq!(descriptor.label_key, "requesty");
assert_eq!(
descriptor.default_endpoint.as_deref(),
Some("https://router.requesty.ai/v1")
);
assert_eq!(
descriptor.default_model.as_deref(),
Some("openai/gpt-4o-mini")
);
assert_eq!(
descriptor.default_request_format,
Some(LlmRequestFormat::ChatCompletions)
);
assert_eq!(descriptor.supported_request_formats, LlmRequestFormat::ALL);
assert_eq!(descriptor.validation_probe, ValidationProbe::LlmText);
assert!(api_key_required(
ProviderKind::Llm,
"requesty",
Some("https://router.requesty.ai/v1/chat/completions")
));
let mut configuration = CredentialConfiguration {
llm_endpoint: true,
llm_api_key_required: true,
llm_model: true,
..CredentialConfiguration::default()
};
assert!(!llm_configured("requesty", &configuration));
configuration.llm_api_key = true;
assert!(llm_configured("requesty", &configuration));
}

#[test]
fn tencent_cloud_asr_and_tokenhub_supply_defaults_and_credentials() {
assert!(crate::cloud_providers::SHARED_CLOUD_ASR_PROVIDER_TYPES.contains(&"tencent-cloud"));
Expand Down
2 changes: 1 addition & 1 deletion openless-all/app/linux-egui/assets/ui-locales.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions openless-all/app/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1354,6 +1354,7 @@ export const de: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (kostenlose Modelle)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1315,6 +1315,7 @@ export const en: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (free models)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1346,6 +1346,7 @@ export const es: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (modelos gratuitos)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1363,6 +1363,7 @@ export const fr: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (modèles gratuits)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1303,6 +1303,7 @@ export const ja: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter(無料モデル)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1295,6 +1295,7 @@ export const ko: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter(무료 모델)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/zh-CN.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1253,6 +1253,7 @@ export const zhCN = {
mimo: '小米 MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter(免费模型)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: '阿里云 Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/i18n/zh-TW.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1254,6 +1254,7 @@ export const zhTW: typeof zhCN = {
mimo: '小米 MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter(免費模型)',
requesty: 'Requesty',
orcarouter: 'OrcaRouter',
alibabaCoding: '阿里雲 Coding Plan',
codingPlanX: 'CodingPlanX',
Expand Down
16 changes: 16 additions & 0 deletions openless-all/app/src/lib/ipc/mock-provider-descriptors.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,22 @@
],
"validationProbe": "llm_text"
},
{
"authRequirement": "api_key_unless_custom_endpoint",
"defaultEndpoint": "https://router.requesty.ai/v1",
"defaultModel": "openai/gpt-4o-mini",
"defaultRequestFormat": "chat_completions",
"kind": "llm",
"labelKey": "requesty",
"providerType": "requesty",
"staticModels": [],
"supportedRequestFormats": [
"chat_completions",
"responses",
"messages"
],
"validationProbe": "llm_text"
},
{
"authRequirement": "api_key_unless_custom_endpoint",
"defaultEndpoint": "https://api.orcarouter.ai/v1",
Expand Down
16 changes: 16 additions & 0 deletions openless-all/app/src/lib/ipc/provider-descriptors.generated.json
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,22 @@
],
"validationProbe": "llm_text"
},
{
"authRequirement": "api_key_unless_custom_endpoint",
"defaultEndpoint": "https://router.requesty.ai/v1",
"defaultModel": "openai/gpt-4o-mini",
"defaultRequestFormat": "chat_completions",
"kind": "llm",
"labelKey": "requesty",
"providerType": "requesty",
"staticModels": [],
"supportedRequestFormats": [
"chat_completions",
"responses",
"messages"
],
"validationProbe": "llm_text"
},
{
"authRequirement": "api_key_unless_custom_endpoint",
"defaultEndpoint": "https://api.orcarouter.ai/v1",
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/pages/Overview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ const LLM_NAME_KEY_BY_ID: Record<string, string> = {
mimo: 'mimo',
cometapi: 'cometapi',
openrouterFree: 'openrouterFree',
requesty: 'requesty',
orcarouter: 'orcarouter',
alibabaCoding: 'alibabaCoding',
codingPlanX: 'codingPlanX',
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/src/pages/settings/ProvidersSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ export const LLM_LABELS = [
['mimo', 'mimo'],
['cometapi', 'cometapi'],
['openrouterFree', 'openrouterFree'],
['requesty', 'requesty'],
['orcarouter', 'orcarouter'],
['alibabaCoding', 'alibabaCoding'],
['codingPlanX', 'codingPlanX'],
Expand Down