Skip to content
Merged
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ See the full history in [CHANGELOG.md](CHANGELOG.md).
| Sail Research | API Key | Organization credit balance, spend for the reported range (up to 30 days) |
| Linkup | API Key | Account credit balance |
| Sofya | API Key | Available, plan and purchased credits, Monthly reset (free tier) |
| Tavily | API Key | Account plan usage, API key usage, Pay-as-you-go credits |
| Langdock | Browser cookies / manual Cookie header | Session (5h), Weekly |
| LithosAI | Browser cookies / manual Cookie header | Prepaid balance, UTC spend today and this month |
| Muse (muse.ai) | Browser cookies / manual Cookie header | Weekly usage, tokens left, top-up tokens |
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions apps/desktop-tauri/src/components/providers/providerIcons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ import sofya from "./icons/ProviderIcon-sofya.svg?raw";
import stepfun from "./icons/ProviderIcon-stepfun.svg?raw";
import sub2api from "./icons/ProviderIcon-sub2api.svg?raw";
import synthetic from "./icons/ProviderIcon-synthetic.svg?raw";
import tavily from "./icons/ProviderIcon-tavily.svg?raw";
import clawrouter from "./icons/ProviderIcon-clawrouter.svg?raw";
import t3chat from "./icons/ProviderIcon-t3chat.svg?raw";
import tinyapi from "./icons/ProviderIcon-tinyapi.svg?raw";
Expand Down Expand Up @@ -180,6 +181,7 @@ const RAW: Record<string, string> = {
stepfun: tint(stepfun),
sub2api: tint(sub2api),
synthetic: tint(synthetic),
tavily: tint(tavily),
clawrouter: tint(clawrouter),
t3chat: tint(t3chat),
tinyapi: tint(tinyapi),
Expand Down Expand Up @@ -279,6 +281,7 @@ export const PROVIDER_ICON_REGISTRY: Record<string, ProviderIcon> = {
venice: { id: "venice", brandColor: "#3c8fdd", fallbackLetter: "V", svgPath: RAW.venice },
vercel: { id: "vercel", brandColor: "#737373", fallbackLetter: "V", svgPath: RAW.vercel },
synthetic: { id: "synthetic", brandColor: "#141414", fallbackLetter: "S", svgPath: RAW.synthetic },
tavily: { id: "tavily", brandColor: "#0F766E", fallbackLetter: "T", svgPath: RAW.tavily },
clawrouter: { id: "clawrouter", brandColor: "#596EF6", fallbackLetter: "C", svgPath: RAW.clawrouter },
ibmbob: { id: "ibmbob", brandColor: "#0E61FA", fallbackLetter: "B", svgPath: RAW.ibmbob },
langdock: { id: "langdock", brandColor: "#5A4AE7", fallbackLetter: "L", svgPath: RAW.langdock },
Expand Down
1 change: 1 addition & 0 deletions apps/desktop-tauri/src/test/providerCatalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ export const TEST_PROVIDER_CATALOG: Array<[string, string]> = [
["raycast", "Raycast"],
["synthetic", "Synthetic"],
["sailresearch", "Sail Research"],
["tavily", "Tavily"],
["clawrouter", "ClawRouter"],
["ibmbob", "IBM Bob"],
["langdock", "Langdock"],
Expand Down
20 changes: 20 additions & 0 deletions docs/PROVIDERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,26 @@ Configure the API key in Settings → Providers → Sofya (or `SOFYA_API_KEY`).
- Every non-200 status reports "Sofya returned HTTP <status>."; other account
fields (email, API key, usernames) are never read or displayed.

### Tavily

Tavily reads `GET https://api.tavily.com/usage` with bearer authentication.
Configure the API key in Settings → Providers → Tavily (or `TAVILY_API_KEY`).

- The "Account plan" lane reads `account.plan_usage` / `account.plan_limit`.
The "API key" lane reads `key.usage` / `key.limit`. A null key limit means
Unlimited; zero limits and unlimited keys display their rows without a
usage percentage. Remaining credits are the nonnegative difference between
reported cap and usage.
- Pay-as-you-go totals, when present (`account.paygo_usage` and
`account.paygo_limit`), appear in a separate detail section.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- The plan name (`account.current_plan`) identifies the account plan. No email
or account ID is inferred; unknown plans do not create a phantom identity.
- Non-200 responses report "Tavily returned HTTP <status>."; response bodies
are never echoed in errors.
- Tavily limits the usage endpoint to 10 requests per 10 minutes. Keep
refreshes at least one minute apart and avoid repeated manual refreshes. A
throttled request fails as rate-limited without automatic replay.

### ClawRouter

ClawRouter reports the monthly budget, spend and routed-provider usage of one
Expand Down
10 changes: 9 additions & 1 deletion rust/src/core/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ pub enum ProviderId {
MuseAI,
WorkBuddy,
SailResearch,
Tavily,
}

impl ProviderId {
Expand Down Expand Up @@ -222,6 +223,7 @@ impl ProviderId {
ProviderId::MuseAI,
ProviderId::WorkBuddy,
ProviderId::SailResearch,
ProviderId::Tavily,
]
}

Expand Down Expand Up @@ -287,6 +289,7 @@ impl ProviderId {
ProviderId::MuseAI => "museai",
ProviderId::WorkBuddy => "workbuddy",
ProviderId::SailResearch => "sailresearch",
ProviderId::Tavily => "tavily",
ProviderId::AiAnd => "aiand",
ProviderId::Windsurf => "windsurf",
ProviderId::Manus => "manus",
Expand Down Expand Up @@ -395,6 +398,7 @@ impl ProviderId {
ProviderId::MuseAI => "Muse (muse.ai)",
ProviderId::WorkBuddy => "WorkBuddy",
ProviderId::SailResearch => "Sail Research",
ProviderId::Tavily => "Tavily",
ProviderId::AiAnd => "ai&",
ProviderId::Windsurf => "Windsurf",
ProviderId::Manus => "Manus",
Expand Down Expand Up @@ -520,6 +524,7 @@ impl ProviderId {
ProviderId::MuseAI => Some("muse.ai"),
ProviderId::WorkBuddy => Some("workbuddy.cn"),
ProviderId::SailResearch => None,
ProviderId::Tavily => None,
ProviderId::AiAnd => None,
ProviderId::Windsurf => None,
ProviderId::Doubao => None,
Expand Down Expand Up @@ -693,6 +698,7 @@ impl ProviderId {
"museai" | "muse (muse.ai)" => Some(ProviderId::MuseAI),
"workbuddy" => Some(ProviderId::WorkBuddy),
"sailresearch" | "sail research" => Some(ProviderId::SailResearch),
"tavily" => Some(ProviderId::Tavily),
_ => None,
}
}
Expand Down Expand Up @@ -1416,6 +1422,7 @@ pub fn brand_color(id: ProviderId) -> &'static str {
ProviderId::MuseAI => "#0668E1",
ProviderId::WorkBuddy => "#0DC8A6",
ProviderId::SailResearch => "#2C4681",
ProviderId::Tavily => "#0F766E",
}
}

Expand All @@ -1430,7 +1437,7 @@ mod tests {
#[test]
fn test_provider_id_all() {
let all = ProviderId::all();
assert_eq!(all.len(), 101);
assert_eq!(all.len(), 102);
assert!(all.contains(&ProviderId::Claude));
assert!(all.contains(&ProviderId::Codex));
assert!(all.contains(&ProviderId::Pi));
Expand Down Expand Up @@ -1512,6 +1519,7 @@ mod tests {
assert!(all.contains(&ProviderId::WorkBuddy));
assert!(all.contains(&ProviderId::SailResearch));
assert!(all.contains(&ProviderId::TinyApi));
assert!(all.contains(&ProviderId::Tavily));
}

#[test]
Expand Down
3 changes: 3 additions & 0 deletions rust/src/core/provider_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use crate::providers::LinkupProvider;
use crate::providers::LithosAIProvider;
use crate::providers::MuseAIProvider;
use crate::providers::SyntheticProvider;
use crate::providers::TavilyProvider;
use crate::providers::WorkBuddyProvider;
use crate::providers::{
AbacusProvider, AiAndProvider, AixyProvider, AlibabaProvider, AlibabaTokenPlanProvider,
Expand Down Expand Up @@ -58,6 +59,7 @@ pub fn instantiate(id: ProviderId) -> Box<dyn Provider> {
ProviderId::LithosAI => Box::new(LithosAIProvider::new()),
ProviderId::MuseAI => Box::new(MuseAIProvider::new()),
ProviderId::WorkBuddy => Box::new(WorkBuddyProvider::new()),
ProviderId::Tavily => Box::new(TavilyProvider::new()),
ProviderId::Factory => Box::new(FactoryProvider::new()),
ProviderId::Zai => Box::new(ZaiProvider::new()),
ProviderId::Kiro => Box::new(KiroProvider::new()),
Expand Down Expand Up @@ -182,6 +184,7 @@ pub fn pace_capability(id: ProviderId) -> ProviderPaceCapability {
| ProviderId::LithosAI
| ProviderId::MuseAI
| ProviderId::WorkBuddy
| ProviderId::Tavily
| ProviderId::Factory
| ProviderId::Kiro
| ProviderId::VertexAI
Expand Down
3 changes: 2 additions & 1 deletion rust/src/core/token_accounts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,8 @@ impl TokenAccountSupport {
| ProviderId::SailResearch
| ProviderId::Sofya
| ProviderId::TinyApi
| ProviderId::Xapi => None,
| ProviderId::Xapi
| ProviderId::Tavily => None,
}
}

Expand Down
2 changes: 2 additions & 0 deletions rust/src/providers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ pub mod stepfun;
pub mod sub2api;
pub mod synthetic;
pub mod t3chat;
pub mod tavily;
pub mod tinyapi;
pub mod typesafe;
pub mod v0;
Expand Down Expand Up @@ -197,6 +198,7 @@ pub use stepfun::StepFunProvider;
pub use sub2api::Sub2ApiProvider;
pub use synthetic::SyntheticProvider;
pub use t3chat::T3ChatProvider;
pub use tavily::TavilyProvider;
pub use tinyapi::TinyApiProvider;
pub use typesafe::TypeSafeProvider;
pub use v0::V0Provider;
Expand Down
Loading