首页布局优化前

This commit is contained in:
iven
2026-03-17 23:26:16 +08:00
parent 74dbf42644
commit e262200f1e
89 changed files with 2266 additions and 2120 deletions

View File

@@ -618,7 +618,26 @@ export class GatewayClient {
// === High-level API ===
// Default agent ID for OpenFang (will be set dynamically from /api/agents)
private defaultAgentId: string = 'f77004c8-418f-4132-b7d4-7ecb9d66f44c';
private defaultAgentId: string = '';
/** Try to fetch default agent ID from OpenFang /api/agents endpoint */
async fetchDefaultAgentId(): Promise<string | null> {
try {
// Use /api/agents endpoint which returns array of agents
const agents = await this.restGet<Array<{ id: string; name?: string; state?: string }>>('/api/agents');
if (agents && agents.length > 0) {
// Prefer agent with state "Running", otherwise use first agent
const runningAgent = agents.find((a: { id: string; name?: string; state?: string }) => a.state === 'Running');
const defaultAgent = runningAgent || agents[0];
this.defaultAgentId = defaultAgent.id;
this.log('info', `Fetched default agent from /api/agents: ${this.defaultAgentId} (${defaultAgent.name || 'unnamed'})`);
return this.defaultAgentId;
}
} catch (err) {
this.log('warn', `Failed to fetch default agent from /api/agents: ${err}`);
}
return null;
}
/** Set the default agent ID */
setDefaultAgentId(agentId: string): void {
@@ -642,7 +661,18 @@ export class GatewayClient {
maxTokens?: number;
}): Promise<{ runId: string; sessionId?: string; response?: string }> {
// OpenFang uses /api/agents/{agentId}/message endpoint
const agentId = opts?.agentId || this.defaultAgentId;
let agentId = opts?.agentId || this.defaultAgentId;
// If no agent ID, try to fetch from OpenFang status
if (!agentId) {
await this.fetchDefaultAgentId();
agentId = this.defaultAgentId;
}
if (!agentId) {
throw new Error('No agent available. Please ensure OpenFang has at least one agent.');
}
const result = await this.restPost<{ response?: string; input_tokens?: number; output_tokens?: number }>(`/api/agents/${agentId}/message`, {
message,
session_id: opts?.sessionKey,
@@ -670,10 +700,29 @@ export class GatewayClient {
agentId?: string;
}
): Promise<{ runId: string }> {
const agentId = opts?.agentId || this.defaultAgentId;
let agentId = opts?.agentId || this.defaultAgentId;
const runId = createIdempotencyKey();
const sessionId = opts?.sessionKey || `session_${Date.now()}`;
// If no agent ID, try to fetch from OpenFang status (async, but we'll handle it in connectOpenFangStream)
if (!agentId) {
// Try to get default agent asynchronously
this.fetchDefaultAgentId().then(() => {
const resolvedAgentId = this.defaultAgentId;
if (resolvedAgentId) {
this.streamCallbacks.set(runId, callbacks);
this.connectOpenFangStream(resolvedAgentId, runId, sessionId, message);
} else {
callbacks.onError('No agent available. Please ensure OpenFang has at least one agent.');
callbacks.onComplete();
}
}).catch((err) => {
callbacks.onError(`Failed to get agent: ${err}`);
callbacks.onComplete();
});
return { runId };
}
// Store callbacks for this run
this.streamCallbacks.set(runId, callbacks);
@@ -1087,7 +1136,11 @@ export class GatewayClient {
async getQuickConfig(): Promise<any> {
try {
// Use /api/config endpoint (OpenFang's actual config endpoint)
const config = await this.restGet('/api/config');
const config = await this.restGet<{
data_dir?: string;
home_dir?: string;
default_model?: { model?: string; provider?: string };
}>('/api/config');
// Map OpenFang config to frontend expected format
return {
quickConfig: {
@@ -1098,7 +1151,7 @@ export class GatewayClient {
agentNickname: 'ZCLAW',
scenarios: ['通用对话', '代码助手', '文档编写'],
workspaceDir: config.data_dir || config.home_dir,
gatewayUrl: this.baseUrl,
gatewayUrl: this.getRestBaseUrl(),
defaultModel: config.default_model?.model,
defaultProvider: config.default_model?.provider,
theme: 'dark',