Merge branch 'main' into feat/gemini-proxy-integration
Resolve conflict in claudeProviderPresets.ts: keep both Gemini Native and Shengsuanyun presets.
@@ -1,5 +1,11 @@
|
||||
import React, { useMemo } from "react";
|
||||
import { getIcon, hasIcon, getIconMetadata } from "@/icons/extracted";
|
||||
import {
|
||||
getIcon,
|
||||
hasIcon,
|
||||
getIconMetadata,
|
||||
getIconUrl,
|
||||
isUrlIcon,
|
||||
} from "@/icons/extracted";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
interface ProviderIconProps {
|
||||
@@ -19,21 +25,28 @@ export const ProviderIcon: React.FC<ProviderIconProps> = ({
|
||||
className,
|
||||
showFallback = true,
|
||||
}) => {
|
||||
// 获取图标 SVG
|
||||
// 获取内联 SVG 字符串
|
||||
const iconSvg = useMemo(() => {
|
||||
if (icon && hasIcon(icon)) {
|
||||
if (icon && !isUrlIcon(icon) && hasIcon(icon)) {
|
||||
return getIcon(icon);
|
||||
}
|
||||
return "";
|
||||
}, [icon]);
|
||||
|
||||
// 获取图标 URL(URL_ICONS 列表中的 SVG / 光栅图片)
|
||||
const iconUrl = useMemo(() => {
|
||||
if (icon && isUrlIcon(icon)) {
|
||||
return getIconUrl(icon);
|
||||
}
|
||||
return "";
|
||||
}, [icon]);
|
||||
|
||||
// 计算尺寸样式
|
||||
const sizeStyle = useMemo(() => {
|
||||
const sizeValue = typeof size === "number" ? `${size}px` : size;
|
||||
return {
|
||||
width: sizeValue,
|
||||
height: sizeValue,
|
||||
// 内嵌 SVG 使用 1em 作为尺寸基准,这里同步 fontSize 让图标实际跟随 size 放大
|
||||
fontSize: sizeValue,
|
||||
lineHeight: 1,
|
||||
};
|
||||
@@ -41,14 +54,11 @@ export const ProviderIcon: React.FC<ProviderIconProps> = ({
|
||||
|
||||
// 获取有效颜色:优先使用传入的有效 color,否则从元数据获取 defaultColor
|
||||
const effectiveColor = useMemo(() => {
|
||||
// 只有当 color 是有效的非空字符串时才使用
|
||||
if (color && typeof color === "string" && color.trim() !== "") {
|
||||
return color;
|
||||
}
|
||||
// 否则从元数据获取 defaultColor
|
||||
if (icon) {
|
||||
const metadata = getIconMetadata(icon);
|
||||
// 只有当 defaultColor 不是 currentColor 时才使用
|
||||
if (metadata?.defaultColor && metadata.defaultColor !== "currentColor") {
|
||||
return metadata.defaultColor;
|
||||
}
|
||||
@@ -56,7 +66,7 @@ export const ProviderIcon: React.FC<ProviderIconProps> = ({
|
||||
return undefined;
|
||||
}, [color, icon]);
|
||||
|
||||
// 如果有图标,显示图标
|
||||
// 内联 SVG 渲染(支持 CSS currentColor 着色)
|
||||
if (iconSvg) {
|
||||
return (
|
||||
<span
|
||||
@@ -70,6 +80,22 @@ export const ProviderIcon: React.FC<ProviderIconProps> = ({
|
||||
);
|
||||
}
|
||||
|
||||
// URL-based 图标(大型 SVG / 光栅图片):以 <img> 渲染
|
||||
if (iconUrl) {
|
||||
return (
|
||||
<img
|
||||
src={iconUrl}
|
||||
alt={name}
|
||||
className={cn(
|
||||
"inline-flex items-center justify-center flex-shrink-0 object-contain",
|
||||
className,
|
||||
)}
|
||||
style={{ width: sizeStyle.width, height: sizeStyle.height }}
|
||||
loading="lazy"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// Fallback:显示首字母
|
||||
if (showFallback) {
|
||||
const initials = name
|
||||
|
||||
@@ -1264,12 +1264,22 @@ export function OmoFormFields({
|
||||
) : undefined,
|
||||
maxHeightClass: "max-h-[500px]",
|
||||
children: (
|
||||
<Textarea
|
||||
value={otherFieldsStr}
|
||||
onChange={(e) => onOtherFieldsStrChange(e.target.value)}
|
||||
placeholder='{ "custom_key": "value" }'
|
||||
className="font-mono text-xs min-h-[60px]"
|
||||
/>
|
||||
<>
|
||||
<Textarea
|
||||
value={otherFieldsStr}
|
||||
onChange={(e) => onOtherFieldsStrChange(e.target.value)}
|
||||
placeholder='{ "custom_key": "value" }'
|
||||
className="font-mono text-xs min-h-[60px]"
|
||||
/>
|
||||
{isSlim && (
|
||||
<p className="mt-1 text-[10px] text-muted-foreground">
|
||||
{t("omo.slimOtherFieldsHint", {
|
||||
defaultValue:
|
||||
"Use this area for top-level OMO Slim config such as council, fallback, multiplexer, disabled_mcps, and todoContinuation.",
|
||||
})}
|
||||
</p>
|
||||
)}
|
||||
</>
|
||||
),
|
||||
})}
|
||||
</div>
|
||||
|
||||
@@ -14,10 +14,11 @@ function parseModelsFromConfig(settingsConfig: string) {
|
||||
const env = cfg?.env || {};
|
||||
const model =
|
||||
typeof env.ANTHROPIC_MODEL === "string" ? env.ANTHROPIC_MODEL : "";
|
||||
const reasoning =
|
||||
const explicitReasoning =
|
||||
typeof env.ANTHROPIC_REASONING_MODEL === "string"
|
||||
? env.ANTHROPIC_REASONING_MODEL
|
||||
: "";
|
||||
const reasoning = explicitReasoning || model;
|
||||
const small =
|
||||
typeof env.ANTHROPIC_SMALL_FAST_MODEL === "string"
|
||||
? env.ANTHROPIC_SMALL_FAST_MODEL
|
||||
@@ -92,10 +93,11 @@ export function useModelState({
|
||||
const env = cfg?.env || {};
|
||||
const model =
|
||||
typeof env.ANTHROPIC_MODEL === "string" ? env.ANTHROPIC_MODEL : "";
|
||||
const reasoning =
|
||||
const explicitReasoning =
|
||||
typeof env.ANTHROPIC_REASONING_MODEL === "string"
|
||||
? env.ANTHROPIC_REASONING_MODEL
|
||||
: "";
|
||||
const reasoning = explicitReasoning || model;
|
||||
const small =
|
||||
typeof env.ANTHROPIC_SMALL_FAST_MODEL === "string"
|
||||
? env.ANTHROPIC_SMALL_FAST_MODEL
|
||||
@@ -148,16 +150,17 @@ export function useModelState({
|
||||
? JSON.parse(settingsConfig)
|
||||
: { env: {} };
|
||||
if (!currentConfig.env) currentConfig.env = {};
|
||||
const env = currentConfig.env as Record<string, unknown>;
|
||||
|
||||
// 新键仅写入;旧键不再写入
|
||||
const trimmed = value.trim();
|
||||
if (trimmed) {
|
||||
currentConfig.env[field] = trimmed;
|
||||
env[field] = trimmed;
|
||||
} else {
|
||||
delete currentConfig.env[field];
|
||||
delete env[field];
|
||||
}
|
||||
// 删除旧键
|
||||
delete currentConfig.env["ANTHROPIC_SMALL_FAST_MODEL"];
|
||||
delete env["ANTHROPIC_SMALL_FAST_MODEL"];
|
||||
|
||||
onConfigChange(JSON.stringify(currentConfig, null, 2));
|
||||
} catch (err) {
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
getProviderIconName,
|
||||
getProviderLabel,
|
||||
getSessionKey,
|
||||
highlightText,
|
||||
} from "./utils";
|
||||
|
||||
interface SessionItemProps {
|
||||
@@ -23,6 +24,7 @@ interface SessionItemProps {
|
||||
selectionMode: boolean;
|
||||
isChecked: boolean;
|
||||
isCheckDisabled?: boolean;
|
||||
searchQuery?: string;
|
||||
onSelect: (key: string) => void;
|
||||
onToggleChecked: (checked: boolean) => void;
|
||||
}
|
||||
@@ -33,6 +35,7 @@ export function SessionItem({
|
||||
selectionMode,
|
||||
isChecked,
|
||||
isCheckDisabled = false,
|
||||
searchQuery,
|
||||
onSelect,
|
||||
onToggleChecked,
|
||||
}: SessionItemProps) {
|
||||
@@ -82,7 +85,9 @@ export function SessionItem({
|
||||
{getProviderLabel(session.providerId, t)}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
<span className="text-sm font-medium truncate flex-1">{title}</span>
|
||||
<span className="text-sm font-medium truncate flex-1">
|
||||
{searchQuery ? highlightText(title, searchQuery) : title}
|
||||
</span>
|
||||
<ChevronRight
|
||||
className={cn(
|
||||
"size-4 text-muted-foreground/50 shrink-0 transition-transform",
|
||||
|
||||
@@ -769,6 +769,7 @@ export function SessionManagerPage({ appId }: { appId: string }) {
|
||||
session={session}
|
||||
isSelected={isSelected}
|
||||
selectionMode={selectionMode}
|
||||
searchQuery={search}
|
||||
isChecked={selectedSessionKeys.has(
|
||||
getSessionKey(session),
|
||||
)}
|
||||
@@ -1005,6 +1006,7 @@ export function SessionManagerPage({ appId }: { appId: string }) {
|
||||
message={message}
|
||||
index={index}
|
||||
isActive={activeMessageIndex === index}
|
||||
searchQuery={search}
|
||||
setRef={(el) => {
|
||||
if (el) messageRefs.current.set(index, el);
|
||||
}}
|
||||
|
||||
@@ -9,12 +9,18 @@ import {
|
||||
} from "@/components/ui/tooltip";
|
||||
import { cn } from "@/lib/utils";
|
||||
import type { SessionMessage } from "@/types";
|
||||
import { formatTimestamp, getRoleLabel, getRoleTone } from "./utils";
|
||||
import {
|
||||
formatTimestamp,
|
||||
getRoleLabel,
|
||||
getRoleTone,
|
||||
highlightText,
|
||||
} from "./utils";
|
||||
|
||||
interface SessionMessageItemProps {
|
||||
message: SessionMessage;
|
||||
index: number;
|
||||
isActive: boolean;
|
||||
searchQuery?: string;
|
||||
setRef: (el: HTMLDivElement | null) => void;
|
||||
onCopy: (content: string) => void;
|
||||
}
|
||||
@@ -22,6 +28,7 @@ interface SessionMessageItemProps {
|
||||
export function SessionMessageItem({
|
||||
message,
|
||||
isActive,
|
||||
searchQuery,
|
||||
setRef,
|
||||
onCopy,
|
||||
}: SessionMessageItemProps) {
|
||||
@@ -68,7 +75,9 @@ export function SessionMessageItem({
|
||||
)}
|
||||
</div>
|
||||
<div className="whitespace-pre-wrap break-words [overflow-wrap:anywhere] text-sm leading-relaxed min-w-0">
|
||||
{message.content}
|
||||
{searchQuery
|
||||
? highlightText(message.content, searchQuery)
|
||||
: message.content}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import type { ReactNode } from "react";
|
||||
import { createElement } from "react";
|
||||
import { SessionMeta } from "@/types";
|
||||
|
||||
export const getSessionKey = (session: SessionMeta) =>
|
||||
@@ -78,3 +80,23 @@ export const formatSessionTitle = (session: SessionMeta) => {
|
||||
session.sessionId.slice(0, 8)
|
||||
);
|
||||
};
|
||||
|
||||
export const highlightText = (text: string, query: string): ReactNode => {
|
||||
if (!query) return text;
|
||||
const escaped = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
||||
const parts = text.split(new RegExp(`(${escaped})`, "gi"));
|
||||
if (parts.length === 1) return text;
|
||||
return parts.map((part, i) =>
|
||||
i % 2 === 1
|
||||
? createElement(
|
||||
"mark",
|
||||
{
|
||||
key: i,
|
||||
className:
|
||||
"bg-yellow-200/60 dark:bg-yellow-500/30 text-inherit rounded-sm px-0.5",
|
||||
},
|
||||
part,
|
||||
)
|
||||
: part,
|
||||
);
|
||||
};
|
||||
|
||||
@@ -16,6 +16,7 @@ const MACOS_TERMINALS = [
|
||||
{ value: "kitty", labelKey: "settings.terminal.options.macos.kitty" },
|
||||
{ value: "ghostty", labelKey: "settings.terminal.options.macos.ghostty" },
|
||||
{ value: "wezterm", labelKey: "settings.terminal.options.macos.wezterm" },
|
||||
{ value: "kaku", labelKey: "settings.terminal.options.macos.kaku" },
|
||||
] as const;
|
||||
|
||||
const WINDOWS_TERMINALS = [
|
||||
|
||||
@@ -106,6 +106,22 @@ export const providerPresets: ProviderPreset[] = [
|
||||
icon: "gemini",
|
||||
iconColor: "#4285F4",
|
||||
},
|
||||
{
|
||||
name: "Shengsuanyun",
|
||||
nameKey: "providerForm.presets.shengsuanyun",
|
||||
websiteUrl: "https://www.shengsuanyun.com",
|
||||
apiKeyUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
ANTHROPIC_BASE_URL: "https://router.shengsuanyun.com/api",
|
||||
ANTHROPIC_AUTH_TOKEN: "",
|
||||
},
|
||||
},
|
||||
category: "aggregator",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "shengsuanyun",
|
||||
icon: "shengsuanyun",
|
||||
},
|
||||
{
|
||||
name: "DeepSeek",
|
||||
websiteUrl: "https://platform.deepseek.com",
|
||||
@@ -660,7 +676,7 @@ export const providerPresets: ProviderPreset[] = [
|
||||
category: "third_party",
|
||||
isPartner: true, // 合作伙伴
|
||||
partnerPromotionKey: "x-code", // 促销信息 i18n key
|
||||
icon: "x-code",
|
||||
icon: "xcode",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
@@ -679,6 +695,58 @@ export const providerPresets: ProviderPreset[] = [
|
||||
icon: "ctok",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "DDSHub",
|
||||
websiteUrl: "https://www.ddshub.cc",
|
||||
apiKeyUrl: "https://ddshub.short.gy/ccswitch",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
ANTHROPIC_BASE_URL: "https://www.ddshub.cc",
|
||||
ANTHROPIC_AUTH_TOKEN: "",
|
||||
},
|
||||
},
|
||||
category: "third_party",
|
||||
isPartner: true, // 合作伙伴
|
||||
partnerPromotionKey: "ddshub", // 促销信息 i18n key
|
||||
icon: "dds",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "E-FlowCode",
|
||||
websiteUrl: "https://e-flowcode.cc",
|
||||
apiKeyUrl: "https://e-flowcode.cc",
|
||||
settingsConfig: {
|
||||
effortLevel: "high",
|
||||
env: {
|
||||
ANTHROPIC_AUTH_TOKEN: "",
|
||||
ANTHROPIC_BASE_URL: "https://e-flowcode.cc",
|
||||
},
|
||||
enabledPlugins: {
|
||||
"superpowers@superpowers-marketplace": true,
|
||||
},
|
||||
includeCoAuthoredBy: false,
|
||||
ENABLE_TOOL_SEARCH: true,
|
||||
skipWebFetchPreflight: true,
|
||||
},
|
||||
category: "third_party",
|
||||
endpointCandidates: ["https://e-flowcode.cc"],
|
||||
icon: "eflowcode",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "LionCCAPI",
|
||||
websiteUrl: "https://vibecodingapi.ai",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
ANTHROPIC_BASE_URL: "https://vibecodingapi.ai",
|
||||
ANTHROPIC_AUTH_TOKEN: "",
|
||||
},
|
||||
},
|
||||
category: "third_party",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "lionccapi",
|
||||
icon: "lioncc",
|
||||
},
|
||||
{
|
||||
name: "OpenRouter",
|
||||
websiteUrl: "https://openrouter.ai",
|
||||
@@ -697,6 +765,24 @@ export const providerPresets: ProviderPreset[] = [
|
||||
icon: "openrouter",
|
||||
iconColor: "#6566F1",
|
||||
},
|
||||
{
|
||||
name: "TheRouter",
|
||||
websiteUrl: "https://therouter.ai",
|
||||
apiKeyUrl: "https://dashboard.therouter.ai",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
ANTHROPIC_BASE_URL: "https://api.therouter.ai",
|
||||
ANTHROPIC_AUTH_TOKEN: "",
|
||||
ANTHROPIC_API_KEY: "",
|
||||
ANTHROPIC_MODEL: "anthropic/claude-sonnet-4.6",
|
||||
ANTHROPIC_DEFAULT_HAIKU_MODEL: "anthropic/claude-haiku-4.5",
|
||||
ANTHROPIC_DEFAULT_SONNET_MODEL: "anthropic/claude-sonnet-4.6",
|
||||
ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.6",
|
||||
},
|
||||
},
|
||||
category: "aggregator",
|
||||
endpointCandidates: ["https://api.therouter.ai"],
|
||||
},
|
||||
{
|
||||
name: "Novita AI",
|
||||
websiteUrl: "https://novita.ai",
|
||||
@@ -736,7 +822,7 @@ export const providerPresets: ProviderPreset[] = [
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "Codex (ChatGPT Plus/Pro)",
|
||||
name: "Codex",
|
||||
websiteUrl: "https://openai.com/chatgpt/pricing",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
@@ -775,6 +861,24 @@ export const providerPresets: ProviderPreset[] = [
|
||||
icon: "nvidia",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "PIPELLM",
|
||||
websiteUrl: "https://www.pipellm.ai",
|
||||
apiKeyUrl: "https://code.pipellm.ai/login?ref=uvw650za",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
ANTHROPIC_BASE_URL: "https://cc-api.pipellm.ai",
|
||||
ANTHROPIC_AUTH_TOKEN: "",
|
||||
ANTHROPIC_MODEL: "claude-opus-4-6",
|
||||
ANTHROPIC_DEFAULT_HAIKU_MODEL: "claude-haiku-4-5-20251001",
|
||||
ANTHROPIC_DEFAULT_SONNET_MODEL: "claude-sonnet-4-6",
|
||||
ANTHROPIC_DEFAULT_OPUS_MODEL: "claude-opus-4-6",
|
||||
},
|
||||
includeCoAuthoredBy: false,
|
||||
},
|
||||
category: "aggregator",
|
||||
icon: "pipellm",
|
||||
},
|
||||
{
|
||||
name: "Xiaomi MiMo",
|
||||
websiteUrl: "https://platform.xiaomimimo.com",
|
||||
|
||||
@@ -78,6 +78,22 @@ export const codexProviderPresets: CodexProviderPreset[] = [
|
||||
icon: "openai",
|
||||
iconColor: "#00A67E",
|
||||
},
|
||||
{
|
||||
name: "Shengsuanyun",
|
||||
nameKey: "providerForm.presets.shengsuanyun",
|
||||
websiteUrl: "https://www.shengsuanyun.com",
|
||||
apiKeyUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
|
||||
auth: generateThirdPartyAuth(""),
|
||||
config: generateThirdPartyConfig(
|
||||
"shengsuanyun",
|
||||
"https://router.shengsuanyun.com/api/v1",
|
||||
"gpt-5.4",
|
||||
),
|
||||
category: "aggregator",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "shengsuanyun",
|
||||
icon: "shengsuanyun",
|
||||
},
|
||||
{
|
||||
name: "Azure OpenAI",
|
||||
websiteUrl:
|
||||
@@ -331,7 +347,7 @@ requires_openai_auth = true`,
|
||||
category: "third_party",
|
||||
isPartner: true, // 合作伙伴
|
||||
partnerPromotionKey: "x-code", // 促销信息 i18n key
|
||||
icon: "x-code",
|
||||
icon: "xcode",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
@@ -351,6 +367,66 @@ requires_openai_auth = true`,
|
||||
icon: "ctok",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "LionCCAPI",
|
||||
websiteUrl: "https://vibecodingapi.ai",
|
||||
auth: generateThirdPartyAuth(""),
|
||||
config: generateThirdPartyConfig(
|
||||
"lionccapi",
|
||||
"https://vibecodingapi.ai/v1",
|
||||
"gpt-5.4",
|
||||
),
|
||||
category: "third_party",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "lionccapi",
|
||||
icon: "lioncc",
|
||||
},
|
||||
{
|
||||
name: "E-FlowCode",
|
||||
websiteUrl: "https://e-flowcode.cc",
|
||||
apiKeyUrl: "https://e-flowcode.cc",
|
||||
auth: {
|
||||
OPENAI_API_KEY: "",
|
||||
},
|
||||
config: `model_provider = "e-flowcode"
|
||||
model = "gpt-5.4"
|
||||
model_reasoning_effort = "high"
|
||||
disable_response_storage = true
|
||||
personality = "pragmatic"
|
||||
|
||||
[model_providers.e-flowcode]
|
||||
name = "e-flowcode"
|
||||
base_url = "https://e-flowcode.cc/v1"
|
||||
wire_api = "responses"
|
||||
requires_openai_auth = true
|
||||
model_context_window = 1000000
|
||||
model_auto_compact_token_limit = 9000000`,
|
||||
category: "third_party",
|
||||
endpointCandidates: ["https://e-flowcode.cc/v1"],
|
||||
icon: "eflowcode",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "PIPELLM",
|
||||
websiteUrl: "https://www.pipellm.ai",
|
||||
apiKeyUrl: "https://code.pipellm.ai/login?ref=uvw650za",
|
||||
auth: {
|
||||
OPENAI_API_KEY: "",
|
||||
},
|
||||
config: `model_provider = "custom"
|
||||
model = "gpt-5.4"
|
||||
model_reasoning_effort = "medium"
|
||||
disable_response_storage = true
|
||||
|
||||
[model_providers.custom]
|
||||
name = "custom"
|
||||
wire_api = "responses"
|
||||
requires_openai_auth = true
|
||||
base_url = "https://cc-api.pipellm.ai/v1"`,
|
||||
category: "aggregator",
|
||||
endpointCandidates: ["https://cc-api.pipellm.ai/v1"],
|
||||
icon: "pipellm",
|
||||
},
|
||||
{
|
||||
name: "OpenRouter",
|
||||
websiteUrl: "https://openrouter.ai",
|
||||
@@ -365,4 +441,17 @@ requires_openai_auth = true`,
|
||||
icon: "openrouter",
|
||||
iconColor: "#6566F1",
|
||||
},
|
||||
{
|
||||
name: "TheRouter",
|
||||
websiteUrl: "https://therouter.ai",
|
||||
apiKeyUrl: "https://dashboard.therouter.ai",
|
||||
auth: generateThirdPartyAuth(""),
|
||||
config: generateThirdPartyConfig(
|
||||
"therouter",
|
||||
"https://api.therouter.ai/v1",
|
||||
"openai/gpt-5.3-codex",
|
||||
),
|
||||
endpointCandidates: ["https://api.therouter.ai/v1"],
|
||||
category: "aggregator",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -50,6 +50,25 @@ export const geminiProviderPresets: GeminiProviderPreset[] = [
|
||||
icon: "gemini",
|
||||
iconColor: "#4285F4",
|
||||
},
|
||||
{
|
||||
name: "Shengsuanyun",
|
||||
nameKey: "providerForm.presets.shengsuanyun",
|
||||
websiteUrl: "https://www.shengsuanyun.com",
|
||||
apiKeyUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
GOOGLE_GEMINI_BASE_URL: "https://router.shengsuanyun.com/api",
|
||||
GEMINI_MODEL: "gemini-3.1-pro",
|
||||
},
|
||||
},
|
||||
baseURL: "https://router.shengsuanyun.com/api",
|
||||
model: "gemini-3.1-pro",
|
||||
description: "Shengsuanyun",
|
||||
category: "aggregator",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "shengsuanyun",
|
||||
icon: "shengsuanyun",
|
||||
},
|
||||
{
|
||||
name: "PackyCode",
|
||||
websiteUrl: "https://www.packyapi.com",
|
||||
@@ -224,6 +243,58 @@ export const geminiProviderPresets: GeminiProviderPreset[] = [
|
||||
icon: "ctok",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "LionCCAPI",
|
||||
websiteUrl: "https://vibecodingapi.ai",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
GOOGLE_GEMINI_BASE_URL: "https://vibecodingapi.ai",
|
||||
GEMINI_MODEL: "gemini-3.1-pro",
|
||||
},
|
||||
},
|
||||
baseURL: "https://vibecodingapi.ai",
|
||||
model: "gemini-3.1-pro",
|
||||
description: "LionCCAPI",
|
||||
category: "third_party",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "lionccapi",
|
||||
icon: "lioncc",
|
||||
},
|
||||
{
|
||||
name: "E-FlowCode",
|
||||
websiteUrl: "https://e-flowcode.cc",
|
||||
apiKeyUrl: "https://e-flowcode.cc",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
GOOGLE_GEMINI_BASE_URL: "https://e-flowcode.cc",
|
||||
GEMINI_API_KEY: "",
|
||||
GEMINI_MODEL: "gemini-3.1-pro-preview",
|
||||
},
|
||||
config: {
|
||||
general: {
|
||||
previewFeatures: true,
|
||||
sessionRetention: {
|
||||
enabled: true,
|
||||
maxAge: "30d",
|
||||
warningAcknowledged: true,
|
||||
},
|
||||
},
|
||||
mcpServers: {},
|
||||
security: {
|
||||
auth: {
|
||||
selectedType: "gemini-api-key",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
baseURL: "https://e-flowcode.cc",
|
||||
model: "gemini-3.1-pro-preview",
|
||||
description: "E-FlowCode",
|
||||
category: "third_party",
|
||||
endpointCandidates: ["https://e-flowcode.cc"],
|
||||
icon: "eflowcode",
|
||||
iconColor: "#000000",
|
||||
},
|
||||
{
|
||||
name: "OpenRouter",
|
||||
websiteUrl: "https://openrouter.ai",
|
||||
@@ -241,6 +312,22 @@ export const geminiProviderPresets: GeminiProviderPreset[] = [
|
||||
icon: "openrouter",
|
||||
iconColor: "#6566F1",
|
||||
},
|
||||
{
|
||||
name: "TheRouter",
|
||||
websiteUrl: "https://therouter.ai",
|
||||
apiKeyUrl: "https://dashboard.therouter.ai",
|
||||
settingsConfig: {
|
||||
env: {
|
||||
GOOGLE_GEMINI_BASE_URL: "https://api.therouter.ai",
|
||||
GEMINI_MODEL: "gemini-2.5-pro",
|
||||
},
|
||||
},
|
||||
baseURL: "https://api.therouter.ai",
|
||||
model: "gemini-2.5-pro",
|
||||
description: "TheRouter",
|
||||
category: "aggregator",
|
||||
endpointCandidates: ["https://api.therouter.ai"],
|
||||
},
|
||||
{
|
||||
name: "自定义",
|
||||
websiteUrl: "",
|
||||
|
||||
@@ -58,6 +58,52 @@ export const openclawApiProtocols = [
|
||||
* OpenClaw provider presets list
|
||||
*/
|
||||
export const openclawProviderPresets: OpenClawProviderPreset[] = [
|
||||
{
|
||||
name: "Shengsuanyun",
|
||||
nameKey: "providerForm.presets.shengsuanyun",
|
||||
websiteUrl: "https://www.shengsuanyun.com",
|
||||
apiKeyUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
|
||||
settingsConfig: {
|
||||
baseUrl: "https://router.shengsuanyun.com/api",
|
||||
apiKey: "",
|
||||
api: "anthropic-messages",
|
||||
models: [
|
||||
{
|
||||
id: "claude-opus-4-6",
|
||||
name: "Claude Opus 4.6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 5, output: 25 },
|
||||
},
|
||||
{
|
||||
id: "claude-sonnet-4-6",
|
||||
name: "Claude Sonnet 4.6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 3, output: 15 },
|
||||
},
|
||||
],
|
||||
},
|
||||
category: "aggregator",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "shengsuanyun",
|
||||
icon: "shengsuanyun",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
suggestedDefaults: {
|
||||
model: {
|
||||
primary: "shengsuanyun/claude-opus-4-6",
|
||||
fallbacks: ["shengsuanyun/claude-sonnet-4-6"],
|
||||
},
|
||||
modelCatalog: {
|
||||
"shengsuanyun/claude-opus-4-6": { alias: "Opus" },
|
||||
"shengsuanyun/claude-sonnet-4-6": { alias: "Sonnet" },
|
||||
},
|
||||
},
|
||||
},
|
||||
// ========== Chinese Officials ==========
|
||||
{
|
||||
name: "DeepSeek",
|
||||
@@ -719,6 +765,72 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "TheRouter",
|
||||
websiteUrl: "https://therouter.ai",
|
||||
apiKeyUrl: "https://dashboard.therouter.ai",
|
||||
settingsConfig: {
|
||||
baseUrl: "https://api.therouter.ai/v1",
|
||||
apiKey: "",
|
||||
api: "openai-completions",
|
||||
models: [
|
||||
{
|
||||
id: "anthropic/claude-sonnet-4.6",
|
||||
name: "Claude Sonnet 4.6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
|
||||
},
|
||||
{
|
||||
id: "openai/gpt-5.3-codex",
|
||||
name: "GPT-5.3 Codex",
|
||||
contextWindow: 400000,
|
||||
cost: { input: 5, output: 40, cacheRead: 0.5 },
|
||||
},
|
||||
{
|
||||
id: "openai/gpt-5.2",
|
||||
name: "GPT-5.2",
|
||||
contextWindow: 400000,
|
||||
cost: { input: 1.75, output: 14, cacheRead: 0.175 },
|
||||
},
|
||||
{
|
||||
id: "google/gemini-3-flash-preview",
|
||||
name: "Gemini 3 Flash Preview",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 0.5, output: 3, cacheRead: 0.05 },
|
||||
},
|
||||
{
|
||||
id: "qwen/qwen3-coder-480b",
|
||||
name: "Qwen3 Coder 480B",
|
||||
contextWindow: 262144,
|
||||
cost: { input: 0.6, output: 2.35 },
|
||||
},
|
||||
],
|
||||
},
|
||||
category: "aggregator",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "sk-...",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
suggestedDefaults: {
|
||||
model: {
|
||||
primary: "therouter/anthropic/claude-sonnet-4.6",
|
||||
fallbacks: [
|
||||
"therouter/openai/gpt-5.2",
|
||||
"therouter/google/gemini-3-flash-preview",
|
||||
],
|
||||
},
|
||||
modelCatalog: {
|
||||
"therouter/anthropic/claude-sonnet-4.6": { alias: "Sonnet" },
|
||||
"therouter/openai/gpt-5.2": { alias: "GPT-5.2" },
|
||||
"therouter/google/gemini-3-flash-preview": { alias: "Gemini Flash" },
|
||||
"therouter/openai/gpt-5.3-codex": { alias: "Codex" },
|
||||
"therouter/qwen/qwen3-coder-480b": { alias: "Qwen Coder" },
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ModelScope",
|
||||
websiteUrl: "https://modelscope.cn",
|
||||
@@ -895,6 +1007,56 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [
|
||||
modelCatalog: { "nvidia/moonshotai/kimi-k2.5": { alias: "Kimi" } },
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "PIPELLM",
|
||||
websiteUrl: "https://www.pipellm.ai",
|
||||
apiKeyUrl: "https://code.pipellm.ai/login?ref=uvw650za",
|
||||
settingsConfig: {
|
||||
baseUrl: "https://cc-api.pipellm.ai",
|
||||
apiKey: "",
|
||||
api: "anthropic-messages",
|
||||
models: [
|
||||
{
|
||||
id: "claude-opus-4-6",
|
||||
name: "claude-opus-4-6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 5, output: 25 },
|
||||
},
|
||||
{
|
||||
id: "claude-sonnet-4-6",
|
||||
name: "claude-sonnet-4-6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 3, output: 15 },
|
||||
},
|
||||
{
|
||||
id: "claude-haiku-4-5-20251001",
|
||||
name: "claude-haiku-4-5-20251001",
|
||||
contextWindow: 200000,
|
||||
cost: { input: 0.8, output: 4 },
|
||||
},
|
||||
],
|
||||
},
|
||||
category: "aggregator",
|
||||
icon: "pipellm",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "pipe-...",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
suggestedDefaults: {
|
||||
model: {
|
||||
primary: "pipellm/claude-opus-4-6",
|
||||
fallbacks: ["pipellm/claude-sonnet-4-6"],
|
||||
},
|
||||
modelCatalog: {
|
||||
"pipellm/claude-opus-4-6": { alias: "Opus" },
|
||||
"pipellm/claude-sonnet-4-6": { alias: "Sonnet" },
|
||||
"pipellm/claude-haiku-4-5-20251001": { alias: "Haiku" },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// ========== Third Party Partners ==========
|
||||
{
|
||||
@@ -1380,6 +1542,112 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "LionCCAPI",
|
||||
websiteUrl: "https://vibecodingapi.ai",
|
||||
settingsConfig: {
|
||||
baseUrl: "https://vibecodingapi.ai",
|
||||
apiKey: "",
|
||||
api: "anthropic-messages",
|
||||
models: [
|
||||
{
|
||||
id: "claude-opus-4-6",
|
||||
name: "Claude Opus 4.6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 5, output: 25 },
|
||||
},
|
||||
{
|
||||
id: "claude-sonnet-4-6",
|
||||
name: "Claude Sonnet 4.6",
|
||||
contextWindow: 1000000,
|
||||
cost: { input: 3, output: 15 },
|
||||
},
|
||||
],
|
||||
},
|
||||
category: "third_party",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "lionccapi",
|
||||
icon: "lioncc",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
suggestedDefaults: {
|
||||
model: {
|
||||
primary: "lionccapi/claude-opus-4-6",
|
||||
fallbacks: ["lionccapi/claude-sonnet-4-6"],
|
||||
},
|
||||
modelCatalog: {
|
||||
"lionccapi/claude-opus-4-6": { alias: "Opus" },
|
||||
"lionccapi/claude-sonnet-4-6": { alias: "Sonnet" },
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "E-FlowCode",
|
||||
websiteUrl: "https://e-flowcode.cc",
|
||||
apiKeyUrl: "https://e-flowcode.cc",
|
||||
settingsConfig: {
|
||||
api: "openai-responses",
|
||||
apiKey: "",
|
||||
baseUrl: "https://e-flowcode.cc/v1",
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"codex_cli_rs/0.77.0 (Windows 10.0.26100; x86_64) WindowsTerminal",
|
||||
},
|
||||
models: [
|
||||
{
|
||||
contextWindow: 200000,
|
||||
cost: {
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
input: 0,
|
||||
output: 0,
|
||||
},
|
||||
id: "gpt-5.3-codex",
|
||||
maxTokens: 32000,
|
||||
name: "gpt-5.3-codex",
|
||||
},
|
||||
{
|
||||
id: "gpt-5.4",
|
||||
name: "gpt-5.4",
|
||||
},
|
||||
{
|
||||
id: "gpt-5.2-codex",
|
||||
name: "gpt-5.2-codex",
|
||||
},
|
||||
{
|
||||
id: "gpt-5.2",
|
||||
name: "gpt-5.2",
|
||||
},
|
||||
],
|
||||
},
|
||||
category: "third_party",
|
||||
icon: "eflowcode",
|
||||
iconColor: "#000000",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "sk-...",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
suggestedDefaults: {
|
||||
model: {
|
||||
primary: "eflowcode/gpt-5.3-codex",
|
||||
fallbacks: ["eflowcode/gpt-5.4", "eflowcode/gpt-5.2-codex"],
|
||||
},
|
||||
modelCatalog: {
|
||||
"eflowcode/gpt-5.3-codex": { alias: "gpt-5.3-codex" },
|
||||
"eflowcode/gpt-5.4": { alias: "gpt-5.4" },
|
||||
"eflowcode/gpt-5.2-codex": { alias: "gpt-5.2-codex" },
|
||||
"eflowcode/gpt-5.2": { alias: "gpt-5.2" },
|
||||
},
|
||||
},
|
||||
},
|
||||
// ========== Cloud Providers ==========
|
||||
{
|
||||
name: "AWS Bedrock",
|
||||
|
||||
@@ -291,6 +291,36 @@ export function getPresetModelDefaults(
|
||||
}
|
||||
|
||||
export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
|
||||
{
|
||||
name: "Shengsuanyun",
|
||||
nameKey: "providerForm.presets.shengsuanyun",
|
||||
websiteUrl: "https://www.shengsuanyun.com",
|
||||
apiKeyUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
|
||||
settingsConfig: {
|
||||
npm: "@ai-sdk/anthropic",
|
||||
name: "Shengsuanyun",
|
||||
options: {
|
||||
baseURL: "https://router.shengsuanyun.com/api/v1",
|
||||
apiKey: "",
|
||||
setCacheKey: true,
|
||||
},
|
||||
models: {
|
||||
"claude-opus-4-6": { name: "Claude Opus 4.6" },
|
||||
"claude-sonnet-4-6": { name: "Claude Sonnet 4.6" },
|
||||
},
|
||||
},
|
||||
category: "aggregator",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "shengsuanyun",
|
||||
icon: "shengsuanyun",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "DeepSeek",
|
||||
websiteUrl: "https://platform.deepseek.com",
|
||||
@@ -879,6 +909,37 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "TheRouter",
|
||||
websiteUrl: "https://therouter.ai",
|
||||
apiKeyUrl: "https://dashboard.therouter.ai",
|
||||
settingsConfig: {
|
||||
npm: "@ai-sdk/openai-compatible",
|
||||
name: "TheRouter",
|
||||
options: {
|
||||
baseURL: "https://api.therouter.ai/v1",
|
||||
apiKey: "",
|
||||
setCacheKey: true,
|
||||
},
|
||||
models: {
|
||||
"anthropic/claude-sonnet-4.6": { name: "Claude Sonnet 4.6" },
|
||||
"openai/gpt-5.3-codex": { name: "GPT-5.3 Codex" },
|
||||
"openai/gpt-5.2": { name: "GPT-5.2" },
|
||||
"google/gemini-3-flash-preview": {
|
||||
name: "Gemini 3 Flash Preview",
|
||||
},
|
||||
"qwen/qwen3-coder-480b": { name: "Qwen3 Coder 480B" },
|
||||
},
|
||||
},
|
||||
category: "aggregator",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "sk-...",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Novita AI",
|
||||
websiteUrl: "https://novita.ai",
|
||||
@@ -933,6 +994,34 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "PIPELLM",
|
||||
websiteUrl: "https://www.pipellm.ai",
|
||||
apiKeyUrl: "https://code.pipellm.ai/login?ref=uvw650za",
|
||||
settingsConfig: {
|
||||
npm: "@ai-sdk/anthropic",
|
||||
name: "PIPELLM",
|
||||
options: {
|
||||
baseURL: "https://cc-api.pipellm.ai",
|
||||
apiKey: "",
|
||||
setCacheKey: true,
|
||||
},
|
||||
models: {
|
||||
"claude-opus-4-6": { name: "claude-opus-4-6" },
|
||||
"claude-sonnet-4-6": { name: "claude-sonnet-4-6" },
|
||||
"claude-haiku-4-5-20251001": { name: "claude-haiku-4-5-20251001" },
|
||||
},
|
||||
},
|
||||
category: "aggregator",
|
||||
icon: "pipellm",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "pipe-...",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
name: "PackyCode",
|
||||
@@ -1222,7 +1311,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
|
||||
category: "third_party",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "x-code",
|
||||
icon: "x-code",
|
||||
icon: "xcode",
|
||||
iconColor: "#000000",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
@@ -1262,6 +1351,64 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "LionCCAPI",
|
||||
websiteUrl: "https://vibecodingapi.ai",
|
||||
settingsConfig: {
|
||||
npm: "@ai-sdk/anthropic",
|
||||
name: "LionCCAPI",
|
||||
options: {
|
||||
baseURL: "https://vibecodingapi.ai/v1",
|
||||
apiKey: "",
|
||||
setCacheKey: true,
|
||||
},
|
||||
models: {
|
||||
"claude-opus-4-6": { name: "Claude Opus 4.6" },
|
||||
"claude-sonnet-4-6": { name: "Claude Sonnet 4.6" },
|
||||
},
|
||||
},
|
||||
category: "third_party",
|
||||
isPartner: true,
|
||||
partnerPromotionKey: "lionccapi",
|
||||
icon: "lioncc",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "E-FlowCode",
|
||||
websiteUrl: "https://e-flowcode.cc",
|
||||
apiKeyUrl: "https://e-flowcode.cc",
|
||||
settingsConfig: {
|
||||
npm: "@ai-sdk/openai",
|
||||
options: {
|
||||
apiKey: "",
|
||||
baseURL: "https://e-flowcode.cc/v1",
|
||||
},
|
||||
models: {
|
||||
"gpt-5.2-codex": {
|
||||
name: "gpt-5.2-codex",
|
||||
},
|
||||
"gpt-5.3-codex": {
|
||||
name: "gpt-5.3-codex",
|
||||
},
|
||||
},
|
||||
},
|
||||
category: "third_party",
|
||||
icon: "eflowcode",
|
||||
iconColor: "#000000",
|
||||
templateValues: {
|
||||
apiKey: {
|
||||
label: "API Key",
|
||||
placeholder: "sk-...",
|
||||
editorValue: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "AWS Bedrock",
|
||||
websiteUrl: "https://aws.amazon.com/bedrock/",
|
||||
|
||||
@@ -19,14 +19,18 @@ export function useSessionSearch({
|
||||
sessions,
|
||||
providerFilter,
|
||||
}: UseSessionSearchOptions): UseSessionSearchResult {
|
||||
const filteredByProvider = useMemo(() => {
|
||||
if (providerFilter === "all") return sessions;
|
||||
return sessions.filter((s) => s.providerId === providerFilter);
|
||||
}, [sessions, providerFilter]);
|
||||
|
||||
const index = useMemo(() => {
|
||||
// 使用 forward tokenizer 支持中文前缀搜索
|
||||
const nextIndex = new FlexSearch.Index({
|
||||
tokenize: "forward",
|
||||
tokenize: "full",
|
||||
resolution: 9,
|
||||
});
|
||||
|
||||
sessions.forEach((session, idx) => {
|
||||
filteredByProvider.forEach((session, idx) => {
|
||||
const metaContent = [
|
||||
session.sessionId,
|
||||
session.title,
|
||||
@@ -41,49 +45,28 @@ export function useSessionSearch({
|
||||
});
|
||||
|
||||
return nextIndex;
|
||||
}, [sessions]);
|
||||
}, [filteredByProvider]);
|
||||
|
||||
// 搜索函数
|
||||
const search = useCallback(
|
||||
(query: string): SessionMeta[] => {
|
||||
const needle = query.trim().toLowerCase();
|
||||
const needle = query.trim();
|
||||
|
||||
// 先按 provider 过滤
|
||||
let filtered = sessions;
|
||||
if (providerFilter !== "all") {
|
||||
filtered = sessions.filter((s) => s.providerId === providerFilter);
|
||||
}
|
||||
|
||||
// 如果没有搜索词,返回按时间排序的结果
|
||||
if (!needle) {
|
||||
return [...filtered].sort((a, b) => {
|
||||
return [...filteredByProvider].sort((a, b) => {
|
||||
const aTs = a.lastActiveAt ?? a.createdAt ?? 0;
|
||||
const bTs = b.lastActiveAt ?? b.createdAt ?? 0;
|
||||
return bTs - aTs;
|
||||
});
|
||||
}
|
||||
|
||||
// 使用 FlexSearch 搜索
|
||||
const results = index.search(needle, { limit: 100 }) as number[];
|
||||
const results = index.search(needle, {
|
||||
limit: filteredByProvider.length,
|
||||
}) as number[];
|
||||
|
||||
// 转换为 session 并过滤
|
||||
const matchedSessions = results
|
||||
.map((idx) => sessions[idx])
|
||||
.filter(
|
||||
(session) =>
|
||||
session &&
|
||||
(providerFilter === "all" || session.providerId === providerFilter),
|
||||
);
|
||||
|
||||
// 按时间排序
|
||||
return matchedSessions.sort((a, b) => {
|
||||
const aTs = a.lastActiveAt ?? a.createdAt ?? 0;
|
||||
const bTs = b.lastActiveAt ?? b.createdAt ?? 0;
|
||||
return bTs - aTs;
|
||||
});
|
||||
return results.map((idx) => filteredByProvider[idx]);
|
||||
},
|
||||
[index, providerFilter, sessions],
|
||||
[index, filteredByProvider],
|
||||
);
|
||||
|
||||
return useMemo(() => ({ search }), [search]);
|
||||
return { search };
|
||||
}
|
||||
|
||||
@@ -243,6 +243,7 @@
|
||||
"title": "Settings",
|
||||
"general": "General",
|
||||
"tabGeneral": "General",
|
||||
"tabAuth": "Auth",
|
||||
"tabAdvanced": "Advanced",
|
||||
"tabProxy": "Proxy",
|
||||
"authCenter": {
|
||||
@@ -535,7 +536,8 @@
|
||||
"alacritty": "Alacritty",
|
||||
"kitty": "Kitty",
|
||||
"ghostty": "Ghostty",
|
||||
"wezterm": "WezTerm"
|
||||
"wezterm": "WezTerm",
|
||||
"kaku": "Kaku"
|
||||
},
|
||||
"windows": {
|
||||
"cmd": "Command Prompt",
|
||||
@@ -772,7 +774,10 @@
|
||||
"ucloud": "Compshare offers an exclusive bonus for CC Switch users — register via this link to get ¥5 platform trial credit!",
|
||||
"micu": "Micu is an official partner of CC Switch",
|
||||
"x-code": "XCodeAPI offers a special bonus for CC Switch users — register via this link and get 10% extra credit on your first order (contact admin to claim)",
|
||||
"ctok": "Join the CTok community on the official website and subscribe to a plan."
|
||||
"ctok": "Join the CTok community on the official website and subscribe to a plan.",
|
||||
"ddshub": "DDSHub offers a special bonus for CC Switch users — register via this link and get 10% extra credit on your first top-up (contact group admin to claim)!",
|
||||
"lionccapi": "LionCCAPI offers exclusive benefits for CC Switch users. After registration, add WeChat HSQBJ088888888 and mention 'cc-switch' to receive $10 free credits!",
|
||||
"shengsuanyun": "Shengsuanyun offers exclusive benefits for CC Switch users. New users who register via this link get ¥10 free credits and 10% bonus on first top-up!"
|
||||
},
|
||||
"presets": {
|
||||
"ucloud": "Compshare"
|
||||
@@ -2278,6 +2283,7 @@
|
||||
"enabledModelsCount": "{{count}} configured models available",
|
||||
"source": "from:",
|
||||
"otherFieldsJson": "Other Fields (JSON)",
|
||||
"slimOtherFieldsHint": "Use this area for top-level OMO Slim config such as council, fallback, multiplexer, disabled_mcps, and todoContinuation.",
|
||||
"searchOrType": "Search or type custom value...",
|
||||
"noMatches": "No matches",
|
||||
"jsonMustBeObject": "{{field}} must be a JSON object",
|
||||
@@ -2354,7 +2360,8 @@
|
||||
"librarian": "Librarian",
|
||||
"explorer": "Explorer",
|
||||
"designer": "Designer",
|
||||
"fixer": "Fixer"
|
||||
"fixer": "Fixer",
|
||||
"council": "Council"
|
||||
},
|
||||
"slimAgentTooltip": {
|
||||
"orchestrator": "Writes executable code, orchestrates multi-agent workflow, summons experts",
|
||||
@@ -2362,7 +2369,8 @@
|
||||
"librarian": "Documentation lookup, GitHub code search (read-only)",
|
||||
"explorer": "Regex search, AST pattern matching, file discovery (read-only)",
|
||||
"designer": "Modern responsive design, CSS/Tailwind expertise",
|
||||
"fixer": "Code implementation, refactoring, testing, verification"
|
||||
"fixer": "Code implementation, refactoring, testing, verification",
|
||||
"council": "Multi-model consensus agent. Runs multiple read-only councillors in parallel, then lets the master synthesize the final answer."
|
||||
}
|
||||
},
|
||||
"openclawConfig": {
|
||||
|
||||
@@ -243,6 +243,7 @@
|
||||
"title": "設定",
|
||||
"general": "一般",
|
||||
"tabGeneral": "一般",
|
||||
"tabAuth": "認証",
|
||||
"tabAdvanced": "詳細",
|
||||
"tabProxy": "プロキシ",
|
||||
"authCenter": {
|
||||
@@ -535,7 +536,8 @@
|
||||
"alacritty": "Alacritty",
|
||||
"kitty": "Kitty",
|
||||
"ghostty": "Ghostty",
|
||||
"wezterm": "WezTerm"
|
||||
"wezterm": "WezTerm",
|
||||
"kaku": "Kaku"
|
||||
},
|
||||
"windows": {
|
||||
"cmd": "コマンドプロンプト",
|
||||
@@ -772,7 +774,10 @@
|
||||
"ucloud": "Compshare は CC Switch ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!",
|
||||
"micu": "Micu は CC Switch の公式パートナーです",
|
||||
"x-code": "XCodeAPI は CC Switch ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、初回注文で 10% の追加クレジットがもらえます(管理者に連絡して受け取り)",
|
||||
"ctok": "公式サイトで CTok コミュニティに参加し、プランを購読してください。"
|
||||
"ctok": "公式サイトで CTok コミュニティに参加し、プランを購読してください。",
|
||||
"ddshub": "DDSHub は CC Switch ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、初回チャージで 10% の追加クレジットがもらえます(グループ管理者に連絡して受け取り)!",
|
||||
"lionccapi": "LionCCAPIはCC Switchユーザーに特別特典を提供しています。登録後、WeChat HSQBJ088888888を追加し、「cc-switch」と伝えると$10分のクレジットがもらえます!",
|
||||
"shengsuanyun": "胜算云はCC Switchユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!"
|
||||
},
|
||||
"presets": {
|
||||
"ucloud": "Compshare"
|
||||
@@ -2278,6 +2283,7 @@
|
||||
"enabledModelsCount": "設定済みモデル {{count}} 件",
|
||||
"source": "出典:",
|
||||
"otherFieldsJson": "その他のフィールド (JSON)",
|
||||
"slimOtherFieldsHint": "council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。",
|
||||
"searchOrType": "検索またはカスタム値を入力...",
|
||||
"noMatches": "一致する項目がありません",
|
||||
"jsonMustBeObject": "{{field}} は JSON オブジェクトである必要があります",
|
||||
@@ -2354,7 +2360,8 @@
|
||||
"librarian": "ライブラリアン",
|
||||
"explorer": "エクスプローラー",
|
||||
"designer": "デザイナー",
|
||||
"fixer": "フィクサー"
|
||||
"fixer": "フィクサー",
|
||||
"council": "カウンシル"
|
||||
},
|
||||
"slimAgentTooltip": {
|
||||
"orchestrator": "実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚",
|
||||
@@ -2362,7 +2369,8 @@
|
||||
"librarian": "ドキュメント検索、GitHubコード検索(読み取り専用)",
|
||||
"explorer": "正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)",
|
||||
"designer": "モダンなレスポンシブデザイン、CSS/Tailwindの専門知識",
|
||||
"fixer": "コード実装、リファクタリング、テスト、検証"
|
||||
"fixer": "コード実装、リファクタリング、テスト、検証",
|
||||
"council": "複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。"
|
||||
}
|
||||
},
|
||||
"openclawConfig": {
|
||||
|
||||
@@ -243,6 +243,7 @@
|
||||
"title": "设置",
|
||||
"general": "通用",
|
||||
"tabGeneral": "通用",
|
||||
"tabAuth": "认证",
|
||||
"tabAdvanced": "高级",
|
||||
"tabProxy": "代理",
|
||||
"authCenter": {
|
||||
@@ -535,7 +536,8 @@
|
||||
"alacritty": "Alacritty",
|
||||
"kitty": "Kitty",
|
||||
"ghostty": "Ghostty",
|
||||
"wezterm": "WezTerm"
|
||||
"wezterm": "WezTerm",
|
||||
"kaku": "Kaku"
|
||||
},
|
||||
"windows": {
|
||||
"cmd": "命令提示符",
|
||||
@@ -772,10 +774,14 @@
|
||||
"ucloud": "优云智算为CC Switch 的用户提供了特殊优惠,通过此链接注册,可以获得五元平台体验金!",
|
||||
"micu": "Micu 是 CC Switch 的官方合作伙伴",
|
||||
"x-code": "XCodeAPI 为CC Switch 的用户提供特别福利,使用此链接注册后首单加赠10%的额度(联系站长领取)",
|
||||
"ctok": "官网加入CTok社群,订阅套餐。"
|
||||
"ctok": "官网加入CTok社群,订阅套餐。",
|
||||
"ddshub": "呆呆兽为CC Switch 的用户提供了特别福利,通过此链接注册后,首单充值可额外赠送 10% 额度(联系群主领取)!",
|
||||
"lionccapi": "LionCCAPI 为 CC Switch 的用户提供了特别福利,注册后添加客服微信HSQBJ088888888,发暗号cc-switch备注即可送10美金额度!",
|
||||
"shengsuanyun": "胜算云为 CC Switch 的用户提供了特别福利,使用此链接注册的新用户可获 10 元模力及首充 10% 赠送!"
|
||||
},
|
||||
"presets": {
|
||||
"ucloud": "优云智算"
|
||||
"ucloud": "优云智算",
|
||||
"shengsuanyun": "胜算云"
|
||||
},
|
||||
"parameterConfig": "参数配置 - {{name}} *",
|
||||
"mainModel": "主模型 (可选)",
|
||||
@@ -2278,6 +2284,7 @@
|
||||
"enabledModelsCount": "可选已配置模型 {{count}} 个",
|
||||
"source": "来源:",
|
||||
"otherFieldsJson": "其他字段 (JSON)",
|
||||
"slimOtherFieldsHint": "OMO Slim 的 council、fallback、multiplexer、disabled_mcps、todoContinuation 等顶层配置请写在这里。",
|
||||
"searchOrType": "搜索或输入自定义值...",
|
||||
"noMatches": "无匹配项",
|
||||
"jsonMustBeObject": "{{field}} 必须是 JSON 对象",
|
||||
@@ -2354,7 +2361,8 @@
|
||||
"librarian": "图书管理员",
|
||||
"explorer": "探索者",
|
||||
"designer": "设计师",
|
||||
"fixer": "修复者"
|
||||
"fixer": "修复者",
|
||||
"council": "议会"
|
||||
},
|
||||
"slimAgentTooltip": {
|
||||
"orchestrator": "编写执行代码,编排多代理工作流,召唤专家",
|
||||
@@ -2362,7 +2370,8 @@
|
||||
"librarian": "文档查询、GitHub 代码搜索(只读)",
|
||||
"explorer": "正则搜索、AST 模式匹配、文件发现(只读)",
|
||||
"designer": "现代响应式设计、CSS/Tailwind 精通",
|
||||
"fixer": "代码实现、重构、测试、验证"
|
||||
"fixer": "代码实现、重构、测试、验证",
|
||||
"council": "多模型共识代理,并行运行多个只读 councillor,再由 master 汇总最终答案。"
|
||||
}
|
||||
},
|
||||
"openclawConfig": {
|
||||
|
||||
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
@@ -107,6 +107,13 @@ export const iconMetadata: Record<string, IconMetadata> = {
|
||||
keywords: ["cubence", "api", "relay"],
|
||||
defaultColor: "#4B5563",
|
||||
},
|
||||
dds: {
|
||||
name: "dds",
|
||||
displayName: "DDS",
|
||||
category: "other",
|
||||
keywords: [],
|
||||
defaultColor: "currentColor",
|
||||
},
|
||||
deepseek: {
|
||||
name: "deepseek",
|
||||
displayName: "DeepSeek",
|
||||
@@ -338,6 +345,13 @@ export const iconMetadata: Record<string, IconMetadata> = {
|
||||
keywords: [],
|
||||
defaultColor: "currentColor",
|
||||
},
|
||||
xcode: {
|
||||
name: "xcode",
|
||||
displayName: "Xcode",
|
||||
category: "tool",
|
||||
keywords: ["apple", "xcode", "ide"],
|
||||
defaultColor: "currentColor",
|
||||
},
|
||||
zhipu: {
|
||||
name: "zhipu",
|
||||
displayName: "Zhipu AI",
|
||||
@@ -352,6 +366,34 @@ export const iconMetadata: Record<string, IconMetadata> = {
|
||||
keywords: ["openrouter", "router", "aggregator"],
|
||||
defaultColor: "#6566F1",
|
||||
},
|
||||
pipellm: {
|
||||
name: "pipellm",
|
||||
displayName: "PIPELLM",
|
||||
category: "ai-provider",
|
||||
keywords: ["pipellm", "pipe"],
|
||||
defaultColor: "currentColor",
|
||||
},
|
||||
eflowcode: {
|
||||
name: "eflowcode",
|
||||
displayName: "E-FlowCode",
|
||||
category: "ai-provider",
|
||||
keywords: ["eflowcode", "e-flowcode", "flow"],
|
||||
defaultColor: "currentColor",
|
||||
},
|
||||
shengsuanyun: {
|
||||
name: "shengsuanyun",
|
||||
displayName: "Shengsuanyun",
|
||||
category: "ai-provider",
|
||||
keywords: ["shengsuanyun", "shengsuanyun"],
|
||||
defaultColor: "currentColor",
|
||||
},
|
||||
lioncc: {
|
||||
name: "lioncc",
|
||||
displayName: "LionCC",
|
||||
category: "ai-provider",
|
||||
keywords: ["lioncc", "lion"],
|
||||
defaultColor: "#F9DA3C",
|
||||
},
|
||||
longcat: {
|
||||
name: "longcat",
|
||||
displayName: "LongCat",
|
||||
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 212 KiB |
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32">
|
||||
<path d="M0 0 C10.56 0 21.12 0 32 0 C32 10.56 32 21.12 32 32 C21.44 32 10.88 32 0 32 C0 21.44 0 10.88 0 0 Z " fill="#E9F5FC" transform="translate(0,0)"/>
|
||||
<path d="M0 0 C0.7734375 -0.00773438 1.546875 -0.01546875 2.34375 -0.0234375 C4.98245826 0.4641499 5.89157252 1.26136133 7.5 3.375 C7.5 4.035 7.5 4.695 7.5 5.375 C4.86 5.375 2.22 5.375 -0.5 5.375 C-0.5 4.715 -0.5 4.055 -0.5 3.375 C-1.49 3.87 -1.49 3.87 -2.5 4.375 C-2.96751788 6.73099235 -2.96751788 6.73099235 -3.125 9.4375 C-3.19976562 10.35660156 -3.27453125 11.27570312 -3.3515625 12.22265625 C-3.40054687 12.93292969 -3.44953125 13.64320312 -3.5 14.375 C-2.84 14.375 -2.18 14.375 -1.5 14.375 C-1.17 13.385 -0.84 12.395 -0.5 11.375 C2.14 11.375 4.78 11.375 7.5 11.375 C7.83 12.365 8.16 13.355 8.5 14.375 C9.16 14.705 9.82 15.035 10.5 15.375 C10.5 14.385 10.5 13.395 10.5 12.375 C11.82 12.375 13.14 12.375 14.5 12.375 C15.07570686 15.08904664 14.79565729 16.83296164 13.46875 19.265625 C10.63940674 22.8167395 8.44343278 24.19169857 3.94140625 25.06640625 C-1.09124454 25.30083101 -5.51954121 25.45246753 -10.02734375 23 C-13.19959195 20.09372762 -14.38901731 18.24700687 -14.9375 13.9375 C-14.793125 13.091875 -14.64875 12.24625 -14.5 11.375 C-11.86 13.355 -9.22 15.335 -6.5 17.375 C-6.5 16.385 -6.5 15.395 -6.5 14.375 C-6.83 14.045 -7.16 13.715 -7.5 13.375 C-7.703125 11.1953125 -7.703125 11.1953125 -7.75 8.5 C-7.77578125 7.61570312 -7.8015625 6.73140625 -7.828125 5.8203125 C-7.5 3.375 -7.5 3.375 -6.265625 1.578125 C-4.03939632 0.06113732 -2.67866058 -0.02678661 0 0 Z " fill="#EAF3FB" transform="translate(16.5,7.625)"/>
|
||||
<path d="M0 0 C5.28 0 10.56 0 16 0 C16 10.56 16 21.12 16 32 C13.36 32 10.72 32 8 32 C8.42152344 31.55269531 8.84304687 31.10539062 9.27734375 30.64453125 C13.5377979 26.01600234 13.5377979 26.01600234 15 20 C13.68 20 12.36 20 11 20 C11 20.99 11 21.98 11 23 C9.68 22.34 8.36 21.68 7 21 C7.33 20.34 7.66 19.68 8 19 C6.700625 19.12375 5.40125 19.2475 4.0625 19.375 C2.96615234 19.47941406 2.96615234 19.47941406 1.84765625 19.5859375 C1.23792969 19.72257812 0.62820312 19.85921875 0 20 C-0.33 20.66 -0.66 21.32 -1 22 C-1.66 22 -2.32 22 -3 22 C-3 18.7 -3 15.4 -3 12 C-2.01 11.67 -1.02 11.34 0 11 C0 11.66 0 12.32 0 13 C2.64 13 5.28 13 8 13 C7.12355567 10.82271927 7.12355567 10.82271927 5 9 C0.32120751 8.25069618 -3.02499663 8.34999775 -7 11 C-7 8 -7 8 -5.46875 6.39453125 C-4.8190625 5.87246094 -4.169375 5.35039063 -3.5 4.8125 C-2.8503125 4.28269531 -2.200625 3.75289063 -1.53125 3.20703125 C-1.0259375 2.80871094 -0.520625 2.41039062 0 2 C0 3.32 0 4.64 0 6 C1.918125 5.938125 1.918125 5.938125 3.875 5.875 C6.0546875 5.8046875 6.0546875 5.8046875 8 6 C10 8 10 8 10.125 10.625 C10.08375 11.40875 10.0425 12.1925 10 13 C11.65 13 13.3 13 15 13 C13.53713212 6.51171219 13.53713212 6.51171219 9 2 C6.00593079 1.38980973 3.04998138 1.13034108 0 1 C0 0.67 0 0.34 0 0 Z " fill="#F3F6FC" transform="translate(16,0)"/>
|
||||
<path d="M0 0 C0.7734375 -0.00773438 1.546875 -0.01546875 2.34375 -0.0234375 C4.98245826 0.4641499 5.89157252 1.26136133 7.5 3.375 C7.5 4.035 7.5 4.695 7.5 5.375 C4.86 5.375 2.22 5.375 -0.5 5.375 C-0.5 4.715 -0.5 4.055 -0.5 3.375 C-1.49 3.87 -1.49 3.87 -2.5 4.375 C-2.96751788 6.73099235 -2.96751788 6.73099235 -3.125 9.4375 C-3.19976563 10.35660156 -3.27453125 11.27570312 -3.3515625 12.22265625 C-3.40054687 12.93292969 -3.44953125 13.64320312 -3.5 14.375 C-2.84 14.375 -2.18 14.375 -1.5 14.375 C-1.17 13.385 -0.84 12.395 -0.5 11.375 C2.14 11.375 4.78 11.375 7.5 11.375 C5.625 15.25 5.625 15.25 4.5 16.375 C2.5390625 16.578125 2.5390625 16.578125 0.125 16.625 C-0.66648437 16.65078125 -1.45796875 16.6765625 -2.2734375 16.703125 C-4.5 16.375 -4.5 16.375 -6.265625 15.171875 C-7.89392995 12.80155767 -7.90051705 11.23290924 -7.875 8.375 C-7.88273438 7.50875 -7.89046875 6.6425 -7.8984375 5.75 C-7.5 3.375 -7.5 3.375 -6.2578125 1.5859375 C-4.03658417 0.05575798 -2.68137219 -0.02681372 0 0 Z " fill="#243FC5" transform="translate(16.5,7.625)"/>
|
||||
<path d="M0 0 C4.29 0 8.58 0 13 0 C13 0.33 13 0.66 13 1 C11.63875 1.37125 11.63875 1.37125 10.25 1.75 C5.85279848 3.42719983 5.85279848 3.42719983 3 7 C2.66982425 10.69051287 2.77068363 14.30545853 3 18 C2.34 18 1.68 18 1 18 C2.27040826 24.22500049 4.65519565 27.37183885 9 32 C6.03 32 3.06 32 0 32 C0 21.44 0 10.88 0 0 Z " fill="#FAFCFD" transform="translate(0,0)"/>
|
||||
<path d="M0 0 C6.82771306 -0.70631514 6.82771306 -0.70631514 9.8671875 1.125 C12.83250747 3.8491217 13.92030982 5.28278834 14.375 9.375 C14.25125 10.24125 14.1275 11.1075 14 12 C12.35 12 10.7 12 9 12 C8.814375 11.05125 8.62875 10.1025 8.4375 9.125 C7.26599195 5.61628301 7.26599195 5.61628301 3.375 4.625 C2.26125 4.41875 1.1475 4.2125 0 4 C0 2.68 0 1.36 0 0 Z " fill="#219DF4" transform="translate(17,1)"/>
|
||||
<path d="M0 0 C-0.97866338 1.14626322 -1.95794587 2.29199788 -2.9375 3.4375 C-3.48277344 4.07558594 -4.02804688 4.71367188 -4.58984375 5.37109375 C-5.36795695 6.26991149 -6.15936528 7.15936528 -7 8 C-7.36760731 10.32817964 -7.70241581 12.6618385 -8 15 C-9.32 15 -10.64 15 -12 15 C-12.89533679 7.5388601 -12.89533679 7.5388601 -10.875 4.06640625 C-7.51165489 0.41402367 -5.09930851 -0.72847264 0 0 Z " fill="#1448D6" transform="translate(14,1)"/>
|
||||
<path d="M0 0 C1.32 0 2.64 0 4 0 C4.46703469 2.64652992 4.39884037 4.36924133 2.9453125 6.66796875 C0.76718269 9.14632727 -0.85756827 10.80140524 -4.1796875 11.37890625 C-6.375 11.375 -6.375 11.375 -10 11 C-10 9.68 -10 8.36 -10 7 C-8.906875 6.773125 -7.81375 6.54625 -6.6875 6.3125 C-2.4291168 4.79680428 -2.08798785 3.77826372 0 0 Z " fill="#0E49D9" transform="translate(27,20)"/>
|
||||
<path d="M0 0 C4.52615993 3.67832017 8.39424999 7.41086363 12 12 C9.00710226 12.42755682 6.86261474 12.55953389 4.265625 10.875 C1.27173282 8.13772715 0.08435644 6.75920797 -0.375 2.625 C-0.25125 1.75875 -0.1275 0.8925 0 0 Z " fill="#0B89F0" transform="translate(2,19)"/>
|
||||
<path d="M0 0 C1.43655854 -0.08131463 2.8744483 -0.13933559 4.3125 -0.1875 C5.51326172 -0.23970703 5.51326172 -0.23970703 6.73828125 -0.29296875 C9 0 9 0 10.79296875 1.38671875 C12 3 12 3 12 5 C9.36 5 6.72 5 4 5 C4 4.34 4 3.68 4 3 C2.68 3.33 1.36 3.66 0 4 C0 2.68 0 1.36 0 0 Z " fill="#3852CA" transform="translate(12,8)"/>
|
||||
<path d="M0 0 C5.28 0 10.56 0 16 0 C16 3.96 16 7.92 16 12 C15.67 12 15.34 12 15 12 C14.7525 11.0925 14.505 10.185 14.25 9.25 C12.88118077 5.69107 12.12750908 4.16519859 9 2 C6.00675528 1.38480808 3.05004295 1.13034372 0 1 C0 0.67 0 0.34 0 0 Z " fill="#FEFEFE" transform="translate(16,0)"/>
|
||||
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 3.96 1 7.92 1 12 C-1.64 12 -4.28 12 -7 12 C-6.57847656 11.55269531 -6.15695313 11.10539062 -5.72265625 10.64453125 C-1.4622021 6.01600234 -1.4622021 6.01600234 0 0 Z " fill="#FDFEFE" transform="translate(31,20)"/>
|
||||
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 4.62 1 9.24 1 14 C0.01 13.34 -0.98 12.68 -2 12 C-2.36328125 9.6875 -2.36328125 9.6875 -2.3125 7 C-2.30863281 6.113125 -2.30476562 5.22625 -2.30078125 4.3125 C-2 2 -2 2 0 0 Z " fill="#1939C2" transform="translate(11,9)"/>
|
||||
<path d="M0 0 C1.98 0.99 1.98 0.99 4 2 C4 4.31 4 6.62 4 9 C2.68 9 1.36 9 0 9 C0 6.03 0 3.06 0 0 Z " fill="#059CF3" transform="translate(2,7)"/>
|
||||
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.66 1.32 7.32 2.64 8 4 C5.36 4 2.72 4 0 4 C0 2.68 0 1.36 0 0 Z " fill="#0773EE" transform="translate(17,27)"/>
|
||||
<path d="M0 0 C2.64 0 5.28 0 8 0 C7.34 1.32 6.68 2.64 6 4 C4.02 4 2.04 4 0 4 C0 2.68 0 1.36 0 0 Z " fill="#0CB7F7" transform="translate(17,1)"/>
|
||||
<path d="M0 0 C2.64 0 5.28 0 8 0 C7.34 1.32 6.68 2.64 6 4 C3.69 3.67 1.38 3.34 -1 3 C-0.67 2.01 -0.34 1.02 0 0 Z " fill="#2F4AC8" transform="translate(16,19)"/>
|
||||
<path d="M0 0 C0.99 0.33 1.98 0.66 3 1 C2.01 2.32 1.02 3.64 0 5 C-1.32 4.67 -2.64 4.34 -4 4 C-2.68 2.68 -1.36 1.36 0 0 Z " fill="#053FD7" transform="translate(7,4)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 286 KiB |
@@ -323,7 +323,7 @@ export interface Settings {
|
||||
|
||||
// ===== 终端设置 =====
|
||||
// 首选终端应用(可选,默认使用系统默认终端)
|
||||
// macOS: "terminal" | "iterm2" | "warp" | "alacritty" | "kitty" | "ghostty"
|
||||
// macOS: "terminal" | "iterm2" | "warp" | "alacritty" | "kitty" | "ghostty" | "wezterm" | "kaku"
|
||||
// Windows: "cmd" | "powershell" | "wt"
|
||||
// Linux: "gnome-terminal" | "konsole" | "xfce4-terminal" | "alacritty" | "kitty" | "ghostty"
|
||||
preferredTerminal?: string;
|
||||
|
||||
@@ -362,6 +362,14 @@ export const OMO_SLIM_BUILTIN_AGENTS: OmoAgentDef[] = [
|
||||
recommended: "gpt-5.4",
|
||||
group: "sub",
|
||||
},
|
||||
{
|
||||
key: "council",
|
||||
display: "Council",
|
||||
descKey: "omo.slimAgentDesc.council",
|
||||
tooltipKey: "omo.slimAgentTooltip.council",
|
||||
recommended: "gpt-5.4-mini",
|
||||
group: "sub",
|
||||
},
|
||||
];
|
||||
|
||||
export const OMO_SLIM_DISABLEABLE_AGENTS = [
|
||||
@@ -371,6 +379,7 @@ export const OMO_SLIM_DISABLEABLE_AGENTS = [
|
||||
{ value: "explorer", label: "Explorer" },
|
||||
{ value: "designer", label: "Designer" },
|
||||
{ value: "fixer", label: "Fixer" },
|
||||
{ value: "council", label: "Council" },
|
||||
] as const;
|
||||
|
||||
export const OMO_SLIM_DISABLEABLE_MCPS = [
|
||||
|
||||