259 lines
7.0 KiB
TypeScript
259 lines
7.0 KiB
TypeScript
import type { Model3DTaskStatus } from "@/services/canvas";
|
|
|
|
type ApiResponse<T = any> = {
|
|
success: boolean;
|
|
data?: T;
|
|
error?: string;
|
|
};
|
|
|
|
export type AiCadProviderStatus = {
|
|
configured: boolean;
|
|
source: "provider" | "env" | "none";
|
|
providerName?: string | null;
|
|
baseUrl?: string | null;
|
|
};
|
|
|
|
export type AiCadWorkspaceSummary = {
|
|
id: string;
|
|
name: string;
|
|
generationProvider: "kittycad-cad" | "tripo-3d";
|
|
versionCount: number;
|
|
completedCount: number;
|
|
hasPendingTasks: boolean;
|
|
latestPrompt?: string | null;
|
|
createdAt?: string | null;
|
|
updatedAt?: string | null;
|
|
};
|
|
|
|
export type AiCadWorkspaceDocument = {
|
|
id: string;
|
|
name: string;
|
|
prompt: string;
|
|
generationProvider: "kittycad-cad" | "tripo-3d";
|
|
modelVersion: string;
|
|
viewerSettings: Record<string, unknown>;
|
|
messages: Record<string, unknown>[];
|
|
versions: Record<string, unknown>[];
|
|
activeVersionId?: string | null;
|
|
createdAt?: string | null;
|
|
updatedAt?: string | null;
|
|
};
|
|
|
|
export type AiCadModelingSession = {
|
|
sessionId: string;
|
|
createdAt?: string | null;
|
|
};
|
|
|
|
export type AiCadModelingCommandPayload = {
|
|
requestId?: string | null;
|
|
responseType?: string | null;
|
|
responseData?: Record<string, any> | null;
|
|
snapshotUrl?: string | null;
|
|
snapshotError?: string | null;
|
|
raw?: any;
|
|
};
|
|
|
|
export const aiCadGenerationService = {
|
|
async listWorkspaces(): Promise<ApiResponse<AiCadWorkspaceSummary[]>> {
|
|
try {
|
|
const response = await fetch("/api/ai-cad/workspaces");
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "读取 AI-CAD 工作台列表失败" };
|
|
}
|
|
},
|
|
|
|
async createWorkspace(params?: {
|
|
name?: string;
|
|
}): Promise<ApiResponse<AiCadWorkspaceSummary>> {
|
|
try {
|
|
const response = await fetch("/api/ai-cad/workspaces", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(params || {}),
|
|
});
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "创建 AI-CAD 工作台失败" };
|
|
}
|
|
},
|
|
|
|
async getWorkspace(
|
|
workspaceId: string
|
|
): Promise<ApiResponse<AiCadWorkspaceDocument | null>> {
|
|
try {
|
|
const response = await fetch(`/api/ai-cad/workspaces/${workspaceId}`);
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "读取 AI-CAD 工作台失败" };
|
|
}
|
|
},
|
|
|
|
async saveWorkspace(
|
|
workspaceId: string,
|
|
params: {
|
|
name?: string;
|
|
prompt: string;
|
|
generationProvider: "kittycad-cad" | "tripo-3d";
|
|
modelVersion: string;
|
|
viewerSettings: Record<string, unknown>;
|
|
messages: Record<string, unknown>[];
|
|
versions: Record<string, unknown>[];
|
|
activeVersionId?: string | null;
|
|
}
|
|
): Promise<
|
|
ApiResponse<{
|
|
id: string;
|
|
name: string;
|
|
updatedAt?: string | null;
|
|
summary?: AiCadWorkspaceSummary;
|
|
}>
|
|
> {
|
|
try {
|
|
const response = await fetch(`/api/ai-cad/workspaces/${workspaceId}`, {
|
|
method: "PUT",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(params),
|
|
});
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "保存 AI-CAD 工作台失败" };
|
|
}
|
|
},
|
|
|
|
async deleteWorkspace(
|
|
workspaceId: string
|
|
): Promise<ApiResponse<{ id: string }>> {
|
|
try {
|
|
const response = await fetch(`/api/ai-cad/workspaces/${workspaceId}`, {
|
|
method: "DELETE",
|
|
});
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "删除 AI-CAD 工作台失败" };
|
|
}
|
|
},
|
|
|
|
async getProviderStatus(): Promise<ApiResponse<AiCadProviderStatus>> {
|
|
try {
|
|
const response = await fetch("/api/ai-cad/provider");
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "读取 AI-CAD 提供商状态失败" };
|
|
}
|
|
},
|
|
|
|
async createTask(params: {
|
|
prompt?: string;
|
|
outputFormat?: string;
|
|
projectName?: string;
|
|
iterationSourceTaskId?: string;
|
|
sourceCode?: string;
|
|
sourceRanges?: Record<string, unknown>[];
|
|
}): Promise<
|
|
ApiResponse<{
|
|
taskId: string;
|
|
status: Model3DTaskStatus;
|
|
conversationId?: string | null;
|
|
modelVersion?: string | null;
|
|
outputFormat?: string | null;
|
|
generationMode?: "create" | "iterate";
|
|
sourceTaskId?: string | null;
|
|
raw?: any;
|
|
}>
|
|
> {
|
|
try {
|
|
const response = await fetch("/api/ai-cad/tasks", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(params),
|
|
});
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "创建 AI-CAD 任务失败" };
|
|
}
|
|
},
|
|
|
|
async createModelingSession(): Promise<ApiResponse<AiCadModelingSession>> {
|
|
try {
|
|
const response = await fetch("/api/ai-cad/modeling/session", {
|
|
method: "POST",
|
|
});
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "创建官方建模会话失败" };
|
|
}
|
|
},
|
|
|
|
async closeModelingSession(
|
|
sessionId: string
|
|
): Promise<ApiResponse<{ sessionId: string }>> {
|
|
try {
|
|
const response = await fetch(
|
|
`/api/ai-cad/modeling/session/${encodeURIComponent(sessionId)}`,
|
|
{
|
|
method: "DELETE",
|
|
}
|
|
);
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "关闭官方建模会话失败" };
|
|
}
|
|
},
|
|
|
|
async sendModelingCommand(params: {
|
|
sessionId: string;
|
|
cmd: Record<string, unknown>;
|
|
cmdId?: string;
|
|
captureSnapshot?: boolean;
|
|
snapshotFormat?: "jpeg" | "png";
|
|
}): Promise<ApiResponse<AiCadModelingCommandPayload>> {
|
|
try {
|
|
const response = await fetch("/api/ai-cad/modeling/command", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(params),
|
|
});
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "发送官方建模命令失败" };
|
|
}
|
|
},
|
|
|
|
async getTask(taskId: string): Promise<
|
|
ApiResponse<{
|
|
taskId: string;
|
|
type: string;
|
|
status: Model3DTaskStatus;
|
|
progress?: number | null;
|
|
output?: Record<string, any>;
|
|
modelUrl?: string | null;
|
|
previewImageUrl?: string | null;
|
|
errorMessage?: string | null;
|
|
conversationId?: string | null;
|
|
modelVersion?: string | null;
|
|
outputFormat?: string | null;
|
|
codeUrl?: string | null;
|
|
downloadUrls?: Record<string, string>;
|
|
}>
|
|
> {
|
|
try {
|
|
const response = await fetch(`/api/ai-cad/tasks/${taskId}`);
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (_error) {
|
|
return { success: false, error: "查询 AI-CAD 任务失败" };
|
|
}
|
|
},
|
|
};
|