
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
Universal TypeScript SDK for 3D generative AI providers. Generate 3D models from text or images using a unified API across multiple providers.
createTask() method for all 16 task typesuseCreateTask, useTaskStatus with automatic pollingPROVIDERS list and PROVIDER_TASK_TYPES mapping for UInpm install magi-3d
# or
pnpm add magi-3d
+------------------------------------------------------------------+
| FRONTEND (React) |
| ----------------- |
| import { useCreateTask, PROVIDERS, PROVIDER_TASK_TYPES } |
| from 'magi-3d/react'; |
| |
| Hook handles: |
| POST /api/3d/task -> submit task with providerId |
| GET /api/3d/task/:id -> poll status with providerId |
+----------------------------------+--------------------------------+
|
v
+------------------------------------------------------------------+
| BACKEND (Your API Routes) |
| ---------------------------------------------------------------- |
| import { Magi3DClient, TripoProvider } from 'magi-3d/server'; |
| |
| POST /api/3d/task -> select provider, client.createTask() |
| GET /api/3d/task/:id -> select provider, client.getTask(id) |
+------------------------------------------------------------------+
// app/api/3d/task/route.ts (Next.js App Router)
import { Magi3DClient, TripoProvider, HunyuanProvider, ProviderId } from 'magi-3d/server';
const providers = {
[ProviderId.TRIPO]: new TripoProvider(), // Uses TRIPO_API_KEY
[ProviderId.HUNYUAN]: new HunyuanProvider({ region: 'ap-guangzhou' }) // Uses HUNYUAN_SECRET_ID/KEY
};
export async function POST(req: Request) {
const { providerId = ProviderId.TRIPO, ...params } = await req.json();
const provider = providers[providerId as ProviderId];
if (!provider) return Response.json({ error: 'Invalid provider' }, { status: 400 });
const client = new Magi3DClient(provider);
const taskId = await client.createTask(params);
return Response.json({ taskId });
}
'use client';
import { useCreateTask, TaskType, TaskStatus, ProviderId } from 'magi-3d/react';
export function Model3DGenerator() {
const { createTask, task, isLoading, progress, error, reset } = useCreateTask({
api: '/api/3d',
onSuccess: (task) => console.log('Model URL:', task.result?.model)
});
return (
<div>
<button
onClick={() => createTask({
type: TaskType.TEXT_TO_3D,
prompt: 'a medieval sword',
providerId: ProviderId.TRIPO
})}
disabled={isLoading}
>
{isLoading ? `Generating (${progress}%)` : 'Generate 3D Model'}
</button>
{task?.status === TaskStatus.SUCCEEDED && (
<a href={task.result?.model} download>Download Model</a>
)}
{error && <p>Error: {error.message}</p>}
</div>
);
}
import { Magi3DClient, TripoProvider, TaskType } from 'magi-3d/server';
const provider = new TripoProvider(); // Uses TRIPO_API_KEY env var
const client = new Magi3DClient(provider);
const taskId = await client.createTask({
type: TaskType.TEXT_TO_3D,
prompt: 'a medieval sword'
});
const result = await client.pollUntilDone(taskId, {
onProgress: (task) => console.log(`${task.progress}%`)
});
console.log('Model URL:', result.result?.model);
import { TripoProvider } from 'magi-3d/server';
const provider = new TripoProvider(); // Uses TRIPO_API_KEY env var
// or: new TripoProvider({ apiKey: '...', stsUpload: true })
import { HunyuanProvider } from 'magi-3d/server';
const provider = new HunyuanProvider({ region: 'ap-guangzhou' });
// Uses HUNYUAN_SECRET_ID and HUNYUAN_SECRET_KEY env vars
| Type | Description | Tripo | Hunyuan |
|---|---|---|---|
TEXT_TO_3D | Generate from text | Yes | Yes |
IMAGE_TO_3D | Generate from image | Yes | Yes |
MULTIVIEW_TO_3D | Generate from multiple views | Yes | Yes |
TEXT_TO_IMAGE | Generate image from text | Yes | - |
GENERATE_IMAGE | Advanced image generation | Yes | - |
TEXTURE | Re-texture model | Yes | Yes |
REFINE | Improve quality | Yes | - |
PRE_RIG_CHECK | Check riggability | Yes | - |
RIG | Add skeleton rigging | Yes | - |
ANIMATE | Apply animation | Yes | - |
SEGMENT | Split into parts | Yes | Yes |
MESH_COMPLETION | Complete mesh parts | Yes | - |
DECIMATE | Reduce polygons | Yes | Yes |
UV_UNWRAP | UV unwrap | - | Yes |
PROFILE_TO_3D | Face photo to 3D | - | Yes |
CONVERT | Format conversion | Yes | Yes |
IMPORT | Import external model | Yes | - |
STYLIZE | Apply artistic style | Yes | - |
All providers return this normalized format:
interface StandardTask {
id: string;
provider: 'tripo' | 'hunyuan';
type: TaskType;
status: 'PENDING' | 'PROCESSING' | 'SUCCEEDED' | 'FAILED' | 'TIMEOUT' | 'CANCELED';
progress: number; // 0-100
progressDetail?: string; // Raw provider status
result?: {
model: string; // Primary model URL - always use this
modelGlb?: string;
modelPbr?: string;
modelBase?: string;
modelFbx?: string;
modelObj?: string;
modelUsdz?: string;
thumbnail?: string;
video?: string;
generatedImage?: string; // For TEXT_TO_IMAGE / GENERATE_IMAGE
riggable?: boolean; // For PRE_RIG_CHECK
rigType?: string; // For PRE_RIG_CHECK
};
error?: { code: string; message: string; raw?: unknown; };
rawResponse?: unknown; // Full provider API response
createdAt: number;
finishedAt?: number;
}
| Variable | Provider | Description |
|---|---|---|
TRIPO_API_KEY | Tripo | API key |
HUNYUAN_SECRET_ID | Hunyuan | Tencent Cloud Secret ID |
HUNYUAN_SECRET_KEY | Hunyuan | Tencent Cloud Secret Key |
// Server-side
import {
Magi3DClient, TripoProvider, HunyuanProvider,
TaskError, ApiError,
type TaskParams, type StandardTask, type TripoOptions, type HunyuanOptions
} from 'magi-3d/server';
// React
import {
useCreateTask, useTaskStatus,
PROVIDERS, PROVIDER_TASK_TYPES,
TaskType, TaskStatus, ProviderId
} from 'magi-3d/react';
MIT
FAQs
A universal TypeScript SDK for 3D generative AI providers.
We found that magi-3d demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.