@origingame/origin-asset 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +225 -0
- package/dist/index.d.ts +912 -0
- package/dist/index.js +1449 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# origin-asset
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for the Origin Asset Gateway service. Mirrors the Rust crate of the same name (`origin-asset` on crates.io).
|
|
4
|
+
|
|
5
|
+
> **Migration note:** This package was previously published as `@doufunao123/assetforge-sdk` (now deprecated). The API surface is unchanged — just update your `package.json` dependency name and import path.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @origingame/origin-asset
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { AssetForge } from "@origingame/origin-asset";
|
|
13
|
+
|
|
14
|
+
const forge = new AssetForge({
|
|
15
|
+
apiKey: "agk_...",
|
|
16
|
+
baseUrl: "https://asset.origingame.dev",
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Generate
|
|
21
|
+
|
|
22
|
+
Generation and processing endpoints are durable-job based. The convenience
|
|
23
|
+
methods below submit a job, then wait via SSE with polling fallback; the initial
|
|
24
|
+
HTTP submit request returns immediately and never holds the provider task open.
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
const image = await forge.image("cinematic sci-fi skyline", {
|
|
28
|
+
size: "1536x1024",
|
|
29
|
+
transparent: true,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const video = await forge.video({
|
|
33
|
+
prompt: "slow camera pan",
|
|
34
|
+
input: image.url!,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const music = await forge.music("uplifting synth theme", { duration: 30 });
|
|
38
|
+
const audio = await forge.audio("explosion sfx", { type: "sfx" });
|
|
39
|
+
const tts = await forge.tts("Hello world", { voice: "Cherry" });
|
|
40
|
+
const model = await forge.model3d("treasure chest");
|
|
41
|
+
const character = await forge.character("medieval knight in plate armor", {
|
|
42
|
+
format: "fbx",
|
|
43
|
+
polycount: 30000,
|
|
44
|
+
pbr: true,
|
|
45
|
+
hd_texture: true,
|
|
46
|
+
pose_mode: "t-pose",
|
|
47
|
+
});
|
|
48
|
+
const prop = await forge.prop("ornate treasure chest", {
|
|
49
|
+
format: "glb",
|
|
50
|
+
pbr: true,
|
|
51
|
+
hd_texture: true,
|
|
52
|
+
});
|
|
53
|
+
const sprite = await forge.sprite("knight walk cycle", {
|
|
54
|
+
animation_type: "walk",
|
|
55
|
+
duration: 2,
|
|
56
|
+
});
|
|
57
|
+
const world = await forge.world("misty medieval village");
|
|
58
|
+
const text = await forge.text("Write a short fantasy intro");
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
const raw = await forge.generate({
|
|
63
|
+
asset_type: "image",
|
|
64
|
+
prompt: "minimal icon set",
|
|
65
|
+
size: "1024x1024",
|
|
66
|
+
transparent: true,
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Jobs
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
const jobs = await forge.job.list({ status: "completed", limit: 20 });
|
|
74
|
+
const job = await forge.job.status("job-id");
|
|
75
|
+
await forge.job.cancel("job-id");
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Async Submit + Wait
|
|
79
|
+
|
|
80
|
+
Pass `async: true` when you want the submit acknowledgement immediately and will
|
|
81
|
+
wait or poll yourself.
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
const ack = await forge.image("cinematic sci-fi skyline", {
|
|
85
|
+
async: true,
|
|
86
|
+
idempotencyKey: "skyline-001",
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const completed = await forge.job.wait(ack.job_id, {
|
|
90
|
+
timeoutMs: 120_000,
|
|
91
|
+
intervalMs: 1_000,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
console.log(completed.output_url);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`idempotencyKey` is forwarded as the `Idempotency-Key` header. `job.wait()` uses authenticated fetch-based SSE first and falls back to polling when SSE is unavailable.
|
|
98
|
+
|
|
99
|
+
## Stream
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
const subscription = forge.stream.job("job-id", (event) => {
|
|
103
|
+
console.log(event.kind, event.status, event.progress?.progress);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Later:
|
|
107
|
+
subscription.close();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
import { subscribeAllJobs } from "@origingame/origin-asset";
|
|
112
|
+
|
|
113
|
+
const allJobs = subscribeAllJobs(
|
|
114
|
+
(event) => console.log(event.job_id, event.status),
|
|
115
|
+
{ apiKey: "agk_..." }
|
|
116
|
+
);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Upload + Assets
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
const uploaded = await forge.upload(file);
|
|
123
|
+
const files = await forge.assets.list();
|
|
124
|
+
await forge.assets.delete(uploaded.filename);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Library
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
const items = await forge.library.search({
|
|
131
|
+
query: "sword",
|
|
132
|
+
mode: "hybrid",
|
|
133
|
+
style: "pixel",
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const ingest = await forge.library.ingest({
|
|
137
|
+
source: "manual",
|
|
138
|
+
asset_type: "image",
|
|
139
|
+
file_url: "https://example.com/fire-sword.png",
|
|
140
|
+
name: "Fire Sword",
|
|
141
|
+
user_tags: ["weapon", "fire"],
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const ingested = await forge.library.ingestWait(ingest.ingest_job_id);
|
|
145
|
+
|
|
146
|
+
await forge.library.packsInstall({
|
|
147
|
+
source: "builtin",
|
|
148
|
+
id: "hello-world",
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const packs = await forge.library.packs();
|
|
152
|
+
|
|
153
|
+
await forge.library.add({
|
|
154
|
+
name: "Fire Sword",
|
|
155
|
+
asset_type: "image",
|
|
156
|
+
file_url: "https://example.com/fire-sword.png",
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Providers
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
const providers = await forge.providers.list();
|
|
164
|
+
const health = await forge.providers.health();
|
|
165
|
+
const gemini = await forge.providers.health("gemini_image");
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Process
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
const processed = await forge.process({
|
|
172
|
+
input: image.url!,
|
|
173
|
+
operations: [
|
|
174
|
+
{ op: "smart_crop", mode: "tightest" },
|
|
175
|
+
{ op: "resize", width: 512, height: 512 },
|
|
176
|
+
],
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const rigged = await forge.process3d({
|
|
180
|
+
task_id: "tripo-task-id",
|
|
181
|
+
operation: "rig",
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Voice
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
await forge.voice.clone({
|
|
189
|
+
audio_base64: "...",
|
|
190
|
+
audio_mime: "audio/mpeg",
|
|
191
|
+
preview_text: "Welcome back.",
|
|
192
|
+
name: "hero",
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const voiceAck = await forge.voice.clone(
|
|
196
|
+
{
|
|
197
|
+
audio_base64: "...",
|
|
198
|
+
audio_mime: "audio/mpeg",
|
|
199
|
+
preview_text: "Welcome back.",
|
|
200
|
+
name: "hero",
|
|
201
|
+
},
|
|
202
|
+
{ async: true }
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
await forge.voice.design({
|
|
206
|
+
voice_prompt: "warm documentary narrator",
|
|
207
|
+
preview_text: "Welcome to AssetForge.",
|
|
208
|
+
name: "narrator",
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
const voices = await forge.voice.list({ type: "vc" });
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Errors
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
import { AssetForgeError } from "@origingame/origin-asset";
|
|
218
|
+
|
|
219
|
+
try {
|
|
220
|
+
await forge.image("...");
|
|
221
|
+
} catch (error) {
|
|
222
|
+
const e = error as AssetForgeError;
|
|
223
|
+
console.error(e.code, e.message);
|
|
224
|
+
}
|
|
225
|
+
```
|