{"_id":"@doufunao123/origin-asset","_rev":"2-444befc8e003f0f3891dc892d131d252","name":"@doufunao123/origin-asset","dist-tags":{"latest":"0.12.0"},"versions":{"0.12.0":{"name":"@doufunao123/origin-asset","version":"0.12.0","keywords":["ai","asset-generation","asset-gateway","origin","sdk"],"license":"MIT","_id":"@doufunao123/origin-asset@0.12.0","maintainers":[{"name":"doufunao123","email":"zhangfan0220@gmail.com"}],"homepage":"https://github.com/fran0220/asset-gateway/tree/main/sdk","bugs":{"url":"https://github.com/fran0220/asset-gateway/issues"},"dist":{"shasum":"73f05c2c9c12838e02d93db03f4f8e2fd4e569b0","tarball":"https://registry.npmjs.org/@doufunao123/origin-asset/-/origin-asset-0.12.0.tgz","fileCount":4,"integrity":"sha512-Mnbj2stbT8C0T/6/ZzVoQujoDEGfP3gXV7gjU3r3osvuWhh8mlCK3d9SsJkBvxJ2xuPaE9nqPWRa+2JdZdEotQ==","signatures":[{"sig":"MEUCIQC4sw9Wi5+Dc+47+2CYGQX4Zzlb8XRXZABEHxZOOwF4kAIgTSTte0dhLH8mxiYqcEQMC6/AQD5jwXxfkKNW/ygH3VU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84504},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f30c5c3ab5076216a1ad063e4847d460136d0801","scripts":{"lint":"tsc --noEmit","build":"tsup src/index.ts --format esm --dts --clean"},"_npmUser":{"name":"doufunao123","email":"zhangfan0220@gmail.com"},"repository":{"url":"git+https://github.com/fran0220/asset-gateway.git","type":"git","directory":"sdk"},"_npmVersion":"10.9.2","description":"TypeScript SDK for the Origin Asset Gateway service","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","typescript":"^5.8.0"},"_npmOperationalInternal":{"tmp":"tmp/origin-asset_0.12.0_1780380608398_0.6825764425302345","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed to '@origingame/origin-asset'. Run: npm i @origingame/origin-asset. Same API, drop-in replacement."}},"time":{"created":"2026-06-02T06:10:07.839Z","modified":"2026-06-02T08:46:09.086Z","0.12.0":"2026-06-02T06:10:08.548Z"},"bugs":{"url":"https://github.com/fran0220/asset-gateway/issues"},"license":"MIT","homepage":"https://github.com/fran0220/asset-gateway/tree/main/sdk","keywords":["ai","asset-generation","asset-gateway","origin","sdk"],"repository":{"url":"git+https://github.com/fran0220/asset-gateway.git","type":"git","directory":"sdk"},"description":"TypeScript SDK for the Origin Asset Gateway service","maintainers":[{"name":"doufunao123","email":"zhangfan0220@gmail.com"}],"readme":"# origin-asset\n\nTypeScript SDK for the Origin Asset Gateway service. Mirrors the Rust crate of the same name (`origin-asset` on crates.io).\n\n> **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.\n\n```bash\nnpm install @doufunao123/origin-asset\n```\n\n```ts\nimport { AssetForge } from \"@doufunao123/origin-asset\";\n\nconst forge = new AssetForge({\n  apiKey: \"agk_...\",\n  baseUrl: \"https://asset.origingame.dev\",\n});\n```\n\n## Generate\n\nGeneration and processing endpoints are durable-job based. The convenience\nmethods below submit a job, then wait via SSE with polling fallback; the initial\nHTTP submit request returns immediately and never holds the provider task open.\n\n```ts\nconst image = await forge.image(\"cinematic sci-fi skyline\", {\n  size: \"1536x1024\",\n  transparent: true,\n});\n\nconst video = await forge.video({\n  prompt: \"slow camera pan\",\n  input: image.url!,\n});\n\nconst music = await forge.music(\"uplifting synth theme\", { duration: 30 });\nconst audio = await forge.audio(\"explosion sfx\", { type: \"sfx\" });\nconst tts = await forge.tts(\"Hello world\", { voice: \"Cherry\" });\nconst model = await forge.model3d(\"treasure chest\");\nconst character = await forge.character(\"medieval knight in plate armor\", {\n  format: \"fbx\",\n  polycount: 30000,\n  pbr: true,\n  hd_texture: true,\n  pose_mode: \"t-pose\",\n});\nconst prop = await forge.prop(\"ornate treasure chest\", {\n  format: \"glb\",\n  pbr: true,\n  hd_texture: true,\n});\nconst sprite = await forge.sprite(\"knight walk cycle\", {\n  animation_type: \"walk\",\n  duration: 2,\n});\nconst world = await forge.world(\"misty medieval village\");\nconst text = await forge.text(\"Write a short fantasy intro\");\n```\n\n```ts\nconst raw = await forge.generate({\n  asset_type: \"image\",\n  prompt: \"minimal icon set\",\n  size: \"1024x1024\",\n  transparent: true,\n});\n```\n\n## Jobs\n\n```ts\nconst jobs = await forge.job.list({ status: \"completed\", limit: 20 });\nconst job = await forge.job.status(\"job-id\");\nawait forge.job.cancel(\"job-id\");\n```\n\n## Async Submit + Wait\n\nPass `async: true` when you want the submit acknowledgement immediately and will\nwait or poll yourself.\n\n```ts\nconst ack = await forge.image(\"cinematic sci-fi skyline\", {\n  async: true,\n  idempotencyKey: \"skyline-001\",\n});\n\nconst completed = await forge.job.wait(ack.job_id, {\n  timeoutMs: 120_000,\n  intervalMs: 1_000,\n});\n\nconsole.log(completed.output_url);\n```\n\n`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.\n\n## Stream\n\n```ts\nconst subscription = forge.stream.job(\"job-id\", (event) => {\n  console.log(event.kind, event.status, event.progress?.progress);\n});\n\n// Later:\nsubscription.close();\n```\n\n```ts\nimport { subscribeAllJobs } from \"@doufunao123/origin-asset\";\n\nconst allJobs = subscribeAllJobs(\n  (event) => console.log(event.job_id, event.status),\n  { apiKey: \"agk_...\" }\n);\n```\n\n## Upload + Assets\n\n```ts\nconst uploaded = await forge.upload(file);\nconst files = await forge.assets.list();\nawait forge.assets.delete(uploaded.filename);\n```\n\n## Library\n\n```ts\nconst items = await forge.library.search({\n  query: \"sword\",\n  mode: \"hybrid\",\n  style: \"pixel\",\n});\n\nconst ingest = await forge.library.ingest({\n  source: \"manual\",\n  asset_type: \"image\",\n  file_url: \"https://example.com/fire-sword.png\",\n  name: \"Fire Sword\",\n  user_tags: [\"weapon\", \"fire\"],\n});\n\nconst ingested = await forge.library.ingestWait(ingest.ingest_job_id);\n\nawait forge.library.packsInstall({\n  source: \"builtin\",\n  id: \"hello-world\",\n});\n\nconst packs = await forge.library.packs();\n\nawait forge.library.add({\n  name: \"Fire Sword\",\n  asset_type: \"image\",\n  file_url: \"https://example.com/fire-sword.png\",\n});\n```\n\n## Providers\n\n```ts\nconst providers = await forge.providers.list();\nconst health = await forge.providers.health();\nconst gemini = await forge.providers.health(\"gemini_image\");\n```\n\n## Process\n\n```ts\nconst processed = await forge.process({\n  input: image.url!,\n  operations: [\n    { op: \"smart_crop\", mode: \"tightest\" },\n    { op: \"resize\", width: 512, height: 512 },\n  ],\n});\n\nconst rigged = await forge.process3d({\n  task_id: \"tripo-task-id\",\n  operation: \"rig\",\n});\n```\n\n## Voice\n\n```ts\nawait forge.voice.clone({\n  audio_base64: \"...\",\n  audio_mime: \"audio/mpeg\",\n  preview_text: \"Welcome back.\",\n  name: \"hero\",\n});\n\nconst voiceAck = await forge.voice.clone(\n  {\n    audio_base64: \"...\",\n    audio_mime: \"audio/mpeg\",\n    preview_text: \"Welcome back.\",\n    name: \"hero\",\n  },\n  { async: true }\n);\n\nawait forge.voice.design({\n  voice_prompt: \"warm documentary narrator\",\n  preview_text: \"Welcome to AssetForge.\",\n  name: \"narrator\",\n});\n\nconst voices = await forge.voice.list({ type: \"vc\" });\n```\n\n## Errors\n\n```ts\nimport { AssetForgeError } from \"@doufunao123/origin-asset\";\n\ntry {\n  await forge.image(\"...\");\n} catch (error) {\n  const e = error as AssetForgeError;\n  console.error(e.code, e.message);\n}\n```\n","readmeFilename":"README.md"}