fix(relay,store): Provider Key 自动恢复 + Agent 创建友好错误 + 登录后重连
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
P0-1: key_pool.rs 新增 cooldown 过期 Key 自动恢复逻辑。 当所有 Key 的 is_active=false 且 cooldown_until 已过期时, 自动重新激活并重试选择,避免 relay/models 返回空数组导致聊天失败。 P0-2: agentStore.ts createClone/createFromTemplate 错误信息 从原始 HTTP 错误改为可操作的中文提示(502/503/401 分类处理)。 P1-2: auth.ts login 成功后触发 connectionStore.connect(), 确保 kernel 使用新 JWT 而非旧 token。
This commit is contained in:
@@ -188,8 +188,16 @@ export const useAgentStore = create<AgentStore>((set, get) => ({
|
||||
await get().loadClones(); // Refresh the list
|
||||
return result?.clone;
|
||||
} catch (err: unknown) {
|
||||
const errorMessage = err instanceof Error ? err.message : String(err);
|
||||
set({ error: errorMessage, isLoading: false });
|
||||
const rawMsg = err instanceof Error ? err.message : String(err);
|
||||
let userMsg: string;
|
||||
if (rawMsg.includes('502') || rawMsg.includes('Bad Gateway')) {
|
||||
userMsg = '创建失败:后端服务暂时不可用,请稍后重试。';
|
||||
} else if (rawMsg.includes('401') || rawMsg.includes('Unauthorized')) {
|
||||
userMsg = '创建失败:登录已过期,请重新登录后重试。';
|
||||
} else {
|
||||
userMsg = rawMsg.length > 100 ? rawMsg.substring(0, 100) + '…' : rawMsg;
|
||||
}
|
||||
set({ error: userMsg, isLoading: false });
|
||||
return undefined;
|
||||
}
|
||||
},
|
||||
@@ -318,7 +326,20 @@ export const useAgentStore = create<AgentStore>((set, get) => ({
|
||||
}
|
||||
return undefined;
|
||||
} catch (error) {
|
||||
set({ error: String(error) });
|
||||
const rawMsg = String(error);
|
||||
// 提供更友好的错误信息,而非暴露原始 HTTP 错误
|
||||
let userMsg: string;
|
||||
if (rawMsg.includes('502') || rawMsg.includes('Bad Gateway')) {
|
||||
userMsg = '创建失败:后端服务暂时不可用,请稍后重试。如果问题持续,请检查 Provider Key 是否已激活。';
|
||||
} else if (rawMsg.includes('503') || rawMsg.includes('Service Unavailable')) {
|
||||
userMsg = '创建失败:服务暂不可用,请稍后重试。';
|
||||
} else if (rawMsg.includes('401') || rawMsg.includes('Unauthorized')) {
|
||||
userMsg = '创建失败:登录已过期,请重新登录后重试。';
|
||||
} else {
|
||||
userMsg = `创建失败:${rawMsg.length > 100 ? rawMsg.substring(0, 100) + '…' : rawMsg}`;
|
||||
}
|
||||
log.error('[AgentStore] createFromTemplate error:', error);
|
||||
set({ error: userMsg });
|
||||
return undefined;
|
||||
} finally {
|
||||
set({ isLoading: false });
|
||||
|
||||
@@ -87,6 +87,18 @@ export function createAuthSlice(set: SetFn, get: GetFn) {
|
||||
get().pushConfigToSaaS().catch((err: unknown) => log.warn('Failed to push config to SaaS:', err));
|
||||
}).catch((err: unknown) => log.warn('Failed to sync config after login:', err));
|
||||
|
||||
// 登录成功后重新建立连接(用新 token 配置 kernel)
|
||||
try {
|
||||
const { useConnectionStore } = await import('../connectionStore');
|
||||
const connState = useConnectionStore.getState();
|
||||
if (connState.connectionState !== 'connected') {
|
||||
log.info('[SaaS Auth] Reconnecting with fresh token after login');
|
||||
connState.connect().catch((err: unknown) => log.warn('[SaaS Auth] Post-login reconnect failed:', err));
|
||||
}
|
||||
} catch (e) {
|
||||
log.warn('[SaaS Auth] Failed to trigger post-login reconnect:', e);
|
||||
}
|
||||
|
||||
initTelemetryCollector(DEVICE_ID);
|
||||
startPromptOTASync(DEVICE_ID);
|
||||
} catch (err: unknown) {
|
||||
|
||||
Reference in New Issue
Block a user