Skip to content
Open
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 AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Coding Guidelines
- Testability: keep parsers and small helpers pure; avoid `Process()`/AppKit in ViewModel.
- Provider Icon Theme Handling:
- Use `ProviderIconThemeHelper` (in `utils/ProviderIconThemeHelper.swift`) for consistent dark/light mode icon adaptation.
- Icons that are black or dark-colored (ChatGPTIcon/Codex, KimiIcon, ZaiIcon, OpenRouterIcon) must be inverted in dark mode for visibility.
- Icons that are black or dark-colored (ChatGPTIcon/Codex, KimiIcon, ZaiIcon, OpenRouterIcon, RequestyIcon) must be inverted in dark mode for visibility.
- For SwiftUI views: use `.providerIconTheme(iconName:)` modifier or `ProviderIconDarkModeModifier` directly.
- For AppKit menus: use `ProviderIconThemeHelper.menuImage(named:)` which automatically handles resizing and dark mode inversion.
- Do NOT manually check dark mode and invert icons; always use the helper to ensure consistency across the app.
Expand Down
16 changes: 16 additions & 0 deletions assets/Assets.xcassets/RequestyIcon.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "requesty.svg",
"idiom" : "mac"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "original"
}
}
1 change: 1 addition & 0 deletions assets/Assets.xcassets/RequestyIcon.imageset/requesty.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 changes: 43 additions & 0 deletions payload/providers.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,49 @@
}
}
},
{
"id" : "requesty",
"name" : "Requesty",
"class" : "openai-compatible",
"managedByCodMate" : true,
"envKey" : "REQUESTY_API_KEY",
"keyURL" : "https://app.requesty.ai/api-keys",
"docsURL" : "https://docs.requesty.ai",
"connectors" : {
"codex" : {
"baseURL" : "https://router.requesty.ai/v1",
"wireAPI" : "chat",
"envHttpHeaders" : {
"HTTP-Referer" : "REQUESTY_REFERRER",
"X-Title" : "REQUESTY_TITLE"
}
},
"claudeCode" : {
"baseURL" : "https://router.requesty.ai",
"modelAliases" : {
"default" : "anthropic/claude-sonnet-4-5"
},
"envHttpHeaders" : {
"x-api-key" : "REQUESTY_API_KEY",
"HTTP-Referer" : "REQUESTY_REFERRER",
"X-Title" : "REQUESTY_TITLE"
}
}
},
"catalog" : {
"models" : [
{ "vendorModelId" : "openai/gpt-4o-mini", "caps" : { "reasoning": false, "tool_use": true, "long_context": true, "vision": true } },
{ "vendorModelId" : "anthropic/claude-sonnet-4-5", "caps" : { "reasoning": true, "tool_use": true, "long_context": true, "vision": true } },
{ "vendorModelId" : "google/gemini-2.5-flash", "caps" : { "reasoning": true, "tool_use": true, "long_context": true, "vision": true } }
]
},
"recommended" : {
"defaultModelFor" : {
"codex" : "openai/gpt-4o-mini",
"claudeCode" : "anthropic/claude-sonnet-4-5"
}
}
},
{
"id" : "openai",
"name" : "OpenAI",
Expand Down
4 changes: 4 additions & 0 deletions utils/ProviderIconResource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ enum ProviderIconResource {
IconMetadata(
name: "OpenRouterIcon", requiresDarkModeInversion: true,
aliases: ["openrouter", "open-router"]),
IconMetadata(
name: "RequestyIcon", requiresDarkModeInversion: true, aliases: ["requesty"]),
IconMetadata(
name: "ZaiIcon", requiresDarkModeInversion: true, aliases: ["zai", "z.ai", "glm"]),
IconMetadata(
Expand Down Expand Up @@ -82,6 +84,8 @@ enum ProviderIconResource {
return "MiniMaxIcon"
} else if baseURL.contains("openrouter.ai") {
return "OpenRouterIcon"
} else if baseURL.contains("requesty.ai") {
return "RequestyIcon"
} else if baseURL.contains("zai.com") || baseURL.contains("z.ai")
|| baseURL.contains("bigmodel.cn")
{
Expand Down
2 changes: 1 addition & 1 deletion views/ProvidersSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1384,7 +1384,7 @@ private struct ProviderEditorSheet: View {
VStack(alignment: .leading, spacing: 12) {
Grid(alignment: .leading, horizontalSpacing: 16, verticalSpacing: 12) {
// Icon picker (only for user-created providers, not bundled/preset providers)
// Bundled providers (Anthropic, DeepSeek, GLM, K2, MiniMax, OpenAI, OpenRouter) use preset brand icons
// Bundled providers (Anthropic, DeepSeek, GLM, K2, MiniMax, OpenAI, OpenRouter, Requesty) use preset brand icons
if vm.isNewProvider
|| (!vm.isEditingBundledProvider()
&& vm.editingProviderBinding()?.managedByCodMate == true)
Expand Down