reborn-minimax-h3 1.0.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/LICENSE +21 -0
- package/README.md +81 -0
- package/cli.mjs +422 -0
- package/package.json +46 -0
- package/skill/SKILL.md +96 -0
- package/skill/h3.json +100 -0
- package/tail.mjs +28 -0
- package//354/225/210/353/202/264/354/212/244/355/202/254.md +94 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 REBORN LABS
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# reborn-minimax-h3
|
|
2
|
+
|
|
3
|
+
미니맥스 H3(MiniMax-H3)를 **어느 길로 쓸지** 골라 주는 클로드 코드 스킬 설치기.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx reborn-minimax-h3
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
깔고 나면 클로드에게 그냥 말하면 됩니다 — **"미니맥스 H3 나한테 맞는 길 골라줘"**
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 이게 왜 필요한가
|
|
14
|
+
|
|
15
|
+
미니맥스 H3 는 영상과 소리를 **한 번에** 만드는 오픈 가중치 모델입니다.
|
|
16
|
+
Artificial Analysis 영상 편집 아레나 1위(확인일 2026-08-26)이고, 가중치가 공개돼 있습니다.
|
|
17
|
+
|
|
18
|
+
그런데 소개 글과 릴스가 공통으로 빠뜨리는 게 셋 있습니다.
|
|
19
|
+
|
|
20
|
+
**① 라이선스 제외 지역에 대한민국이 들어 있습니다.**
|
|
21
|
+
`MiniMax H3 Community License` 의 적용 범위는
|
|
22
|
+
`"Worldwide, excluding the Excluded Territories"` 이고,
|
|
23
|
+
제외 지역은 **유럽연합 · 영국 · 대한민국 · 미국**입니다.
|
|
24
|
+
「무료·오픈소스니까 받아 쓰면 된다」가 한국에서는 그대로 성립하지 않습니다.
|
|
25
|
+
|
|
26
|
+
**② 「VRAM 8GB 로 로컬 구동」은 사실이 아닙니다.**
|
|
27
|
+
실측 기준선은 **VRAM 12GB + 시스템 RAM 약 64GB**, 내려받을 용량 **42.5GB** 입니다.
|
|
28
|
+
8GB 를 믿고 시작하면 42.5GB 를 다 받은 뒤에 못 돌린다는 걸 알게 됩니다.
|
|
29
|
+
|
|
30
|
+
**③ 「구글을 이겼다」는 보드마다 다릅니다.**
|
|
31
|
+
영상 편집은 1위가 맞고, 텍스트→영상은 3 Elo 차 2위입니다.
|
|
32
|
+
|
|
33
|
+
이 스킬은 **그 셋을 먼저 말하고** 길을 고릅니다.
|
|
34
|
+
|
|
35
|
+
## 명령
|
|
36
|
+
|
|
37
|
+
| | |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `npx reborn-minimax-h3` | 스킬을 깐다 (`~/.claude/skills/minimax-h3/`) |
|
|
40
|
+
| `npx reborn-minimax-h3 ways` | 네 갈래를 조건과 함께 전부 본다 (안 깔고) |
|
|
41
|
+
| `npx reborn-minimax-h3 verify` | 주소가 지금 응답하는지 본다 (네트워크) |
|
|
42
|
+
| `npx reborn-minimax-h3 --check` | 깔렸는지 + 원장이 규칙을 지키는지 |
|
|
43
|
+
| `npx reborn-minimax-h3 --self-test` | 자기시험 36건 (네트워크 안 씀) |
|
|
44
|
+
|
|
45
|
+
설치 후 **클로드 코드를 껐다 켜야** 스킬이 잡힙니다.
|
|
46
|
+
|
|
47
|
+
## 네 갈래
|
|
48
|
+
|
|
49
|
+
| 하려는 일 | 길 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| 일단 뭐가 나오는지 보고 싶다 | MiniMax Hub — 브라우저에서 바로 |
|
|
52
|
+
| 만든 걸 콘텐츠에 바로 쓰겠다 | Hailuo AI — 약관 확인 후 |
|
|
53
|
+
| 자동화 파이프라인에 붙이겠다 | fal.ai 호스팅 API |
|
|
54
|
+
| 내 GPU 로 직접 돌리겠다 | 가중치 — ★한국이면 라이선스부터 |
|
|
55
|
+
|
|
56
|
+
## 사실 원장
|
|
57
|
+
|
|
58
|
+
모든 수치는 `skill/h3.json` 한 곳에 있고, **확인일이 붙어 있습니다.**
|
|
59
|
+
크레딧·단가·Elo 는 밖에서 바뀌므로 **숫자를 박아 두지 않은 칸**이 있습니다.
|
|
60
|
+
그 칸은 "서비스 안에서 지금 값을 보세요"로 넘깁니다.
|
|
61
|
+
|
|
62
|
+
`안하는말` 에는 도는 말 중 **사실이 아닌 것 다섯 개**를 이유와 함께 적어 두었습니다.
|
|
63
|
+
|
|
64
|
+
## 자기시험이 양방향인 이유
|
|
65
|
+
|
|
66
|
+
`--self-test` 는 정본 원장을 통과시키는 것으로 끝나지 않습니다.
|
|
67
|
+
일부러 **「대한민국」을 지운 가짜 원장**, **VRAM 을 8GB 로 적은 원장**,
|
|
68
|
+
**보드 이름 없이 「1위」만 적은 원장**을 만들어 검사기가 그걸 **잡는지** 같이 봅니다.
|
|
69
|
+
|
|
70
|
+
전건 통과하는 검사기는 검사기가 아닙니다.
|
|
71
|
+
|
|
72
|
+
## 라이선스
|
|
73
|
+
|
|
74
|
+
MIT (이 설치기). 미니맥스 H3 모델 자체는 `MiniMax H3 Community License` 를 따릅니다 —
|
|
75
|
+
**적용 범위와 제외 지역을 직접 확인하세요.**
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
REBORN LABS · <https://rebornlabs.kr/minimax?utm_source=installer&utm_medium=readme&utm_campaign=minimax>
|
|
80
|
+
|
|
81
|
+
MIT · 문의 <https://mobility.rebornlabs.kr/cs>
|
package/cli.mjs
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* 미니맥스 H3 — 길 고르기 스킬 설치기.
|
|
4
|
+
*
|
|
5
|
+
* npx reborn-minimax-h3 클로드 코드에 스킬을 깐다
|
|
6
|
+
* npx reborn-minimax-h3 ways 네 갈래를 터미널에 그대로 찍는다 (안 깔고)
|
|
7
|
+
* npx reborn-minimax-h3 verify 주소가 지금 응답하는지 본다 (네트워크)
|
|
8
|
+
* npx reborn-minimax-h3 --check 깔렸는지 + 사실 원장이 규칙을 지키는지
|
|
9
|
+
* npx reborn-minimax-h3 --self-test 자기시험 (네트워크 안 씀)
|
|
10
|
+
*
|
|
11
|
+
* ★★이 설치기가 파는 건 파일이 아니라 **사실 원장의 정직함**이다.
|
|
12
|
+
* 그래서 판정을 "복사가 됐나"로 하지 않는다. **원장이 조건을 숨기지 않았나**로 한다.
|
|
13
|
+
*
|
|
14
|
+
* ① 라이선스 제외 지역에 **대한민국**이 적혀 있는가
|
|
15
|
+
* ② 로컬 VRAM 기준선이 **부풀려지지** 않았는가 (도는 말은 8GB, 실측은 12GB)
|
|
16
|
+
* ③ 리더보드 순위에 **어느 보드인지와 상대**가 붙어 있는가
|
|
17
|
+
*
|
|
18
|
+
* ①번이 핵심이다. 원본 릴스는 「완전 무료·오픈소스」라고만 말하고 제외 지역을
|
|
19
|
+
* 한 글자도 말하지 않는다. 그 말을 그대로 옮기면 **우리가 사고를 파는 것**이 된다.
|
|
20
|
+
* 우리 시청자는 대부분 한국에 있다.
|
|
21
|
+
*
|
|
22
|
+
* ★★자기시험은 **양방향**이다. 좋은 원장을 통과시키는 것만으로는 아무것도 증명 못 한다.
|
|
23
|
+
* 일부러 「대한민국」을 지운 가짜 원장을 만들어 검사기가 **그걸 잡는지** 같이 본다.
|
|
24
|
+
* 전건 통과하는 검사기는 검사기가 아니다.
|
|
25
|
+
*/
|
|
26
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
|
|
27
|
+
import { homedir } from "node:os";
|
|
28
|
+
import { dirname, join, relative } from "node:path";
|
|
29
|
+
import { fileURLToPath } from "node:url";
|
|
30
|
+
import { 링크, TAIL, 마지막 } from "./tail.mjs";
|
|
31
|
+
|
|
32
|
+
const HOME = homedir();
|
|
33
|
+
const 여기 = dirname(fileURLToPath(import.meta.url));
|
|
34
|
+
const c = { g: "\x1b[32m", r: "\x1b[31m", y: "\x1b[33m", d: "\x1b[90m", cy: "\x1b[36m", b: "\x1b[1m", 0: "\x1b[0m" };
|
|
35
|
+
|
|
36
|
+
const 스킬이름 = "minimax-h3";
|
|
37
|
+
const 퍼널 = "minimax";
|
|
38
|
+
const 원본 = join(여기, "skill");
|
|
39
|
+
const 대상 = join(HOME, ".claude", "skills", 스킬이름);
|
|
40
|
+
|
|
41
|
+
/** ★반드시 제외 지역에 있어야 하는 것. 여기서 빠지면 **배포를 막는다.**
|
|
42
|
+
* 우리 사용자는 대부분 한국에 있고, 이 한 줄이 「받아도 되나」의 답이다. */
|
|
43
|
+
const 반드시제외 = "대한민국";
|
|
44
|
+
|
|
45
|
+
/** ★로컬 VRAM 최저 기준선(GB). 도는 말은 8GB 지만 실측은 12GB + 시스템 RAM 64GB 다.
|
|
46
|
+
* 8GB 를 믿고 받으면 42.5GB 를 내려받은 뒤에 못 돌린다. */
|
|
47
|
+
const VRAM최저 = 12;
|
|
48
|
+
|
|
49
|
+
/** ★「무료」를 조건 없이 말하면 막는다. 조건은 늘 있다. */
|
|
50
|
+
const 금칙 = [/완전\s*무료/, /무제한/, /검열\s*(이\s*)?없/, /제한\s*없이/];
|
|
51
|
+
|
|
52
|
+
const 길필수칸 = ["키", "이름", "주소", "무엇", "누구", "한국에서", "주의"];
|
|
53
|
+
|
|
54
|
+
function 머리말() {
|
|
55
|
+
console.log(`\n${c.b}미니맥스 H3 — 길 고르기${c[0]} ${c.d}· REBORN LABS · MIT${c[0]}`);
|
|
56
|
+
console.log(`${c.d}네 갈래 중 지금 갈 하나를 골라 줍니다. 한국에서 걸리는 조건을 먼저 말합니다.${c[0]}\n`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function 파일목록(뿌리) {
|
|
60
|
+
const 모음 = [];
|
|
61
|
+
for (const 이름 of readdirSync(뿌리)) {
|
|
62
|
+
const p = join(뿌리, 이름);
|
|
63
|
+
if (statSync(p).isDirectory()) 모음.push(...파일목록(p));
|
|
64
|
+
else 모음.push(p);
|
|
65
|
+
}
|
|
66
|
+
return 모음;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const 원장읽기 = (뿌리) => {
|
|
70
|
+
const f = join(뿌리, "h3.json");
|
|
71
|
+
if (!existsSync(f)) return null;
|
|
72
|
+
try { return JSON.parse(readFileSync(f, "utf8")); } catch { return null; }
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** 문자열에서 첫 숫자를 뽑는다. "12GB (동적 오프로딩을 켠 경우)" → 12 */
|
|
76
|
+
const 첫숫자 = (s) => {
|
|
77
|
+
const m = /(\d+(?:\.\d+)?)/.exec(String(s ?? ""));
|
|
78
|
+
return m ? Number(m[1]) : NaN;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* ★원장 판정. 여기가 이 설치기의 심장이다.
|
|
83
|
+
* 깔렸는지가 아니라 **깔린 원장이 조건을 숨기지 않았는지**를 본다.
|
|
84
|
+
*/
|
|
85
|
+
function 원장검사(d) {
|
|
86
|
+
if (!d) return { 됨: false, 이유: "h3.json 을 못 읽었습니다" };
|
|
87
|
+
if (!d.확인일) return { 됨: false, 이유: "확인일이 없습니다 — 언제 기준인지 모르면 못 믿습니다" };
|
|
88
|
+
|
|
89
|
+
/* ── ① ★라이선스 제외 지역 — 이 킷이 존재하는 이유다 ────────────── */
|
|
90
|
+
const L = d.라이선스;
|
|
91
|
+
if (!L) return { 됨: false, 이유: "라이선스 칸이 통째로 없습니다" };
|
|
92
|
+
if (!L.이름) return { 됨: false, 이유: "라이선스 이름이 없습니다" };
|
|
93
|
+
if (!Array.isArray(L.제외지역) || !L.제외지역.length)
|
|
94
|
+
return { 됨: false, 이유: "제외지역이 비었습니다 — 「무료」의 조건이 바로 이 칸입니다" };
|
|
95
|
+
if (!L.제외지역.includes(반드시제외))
|
|
96
|
+
return { 됨: false, 이유: `제외지역에 「${반드시제외}」 이 없습니다 — 우리 사용자는 대부분 한국에 있습니다` };
|
|
97
|
+
if (!/excluding/i.test(String(L.적용범위원문 || "")))
|
|
98
|
+
return { 됨: false, 이유: "적용범위 원문(\"…excluding the Excluded Territories\")이 없습니다 — 번역만 남기면 나중에 못 다툽니다" };
|
|
99
|
+
if (!L.그래서어떻게)
|
|
100
|
+
return { 됨: false, 이유: "제외 지역이라는 사실만 있고 「그래서 어떻게」가 없습니다 — 막기만 하면 아무도 안 씁니다" };
|
|
101
|
+
|
|
102
|
+
/* ── ② 길 ────────────────────────────────────────────────────── */
|
|
103
|
+
const 길 = d.길;
|
|
104
|
+
if (!Array.isArray(길) || 길.length !== 4)
|
|
105
|
+
return { 됨: false, 이유: `길이 4개여야 하는데 ${Array.isArray(길) ? 길.length : 0}개입니다` };
|
|
106
|
+
for (const w of 길) {
|
|
107
|
+
for (const k of 길필수칸)
|
|
108
|
+
if (!w?.[k] || String(w[k]).trim() === "")
|
|
109
|
+
return { 됨: false, 이유: `「${w?.이름 || "이름없음"}」 의 "${k}" 칸이 비었습니다` };
|
|
110
|
+
if (!/^https:\/\//.test(w.주소))
|
|
111
|
+
return { 됨: false, 이유: `「${w.이름}」 의 주소가 https 가 아닙니다` };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* ★가중치를 직접 받는 길은 **한국 조건을 그 칸 안에서** 말해야 한다.
|
|
115
|
+
라이선스 칸에만 적어 두면, 길만 보고 고른 사람은 그걸 안 읽는다. */
|
|
116
|
+
const 가중치 = 길.find((w) => w.키 === "weights");
|
|
117
|
+
if (!가중치) return { 됨: false, 이유: "가중치를 직접 받는 길(weights)이 없습니다" };
|
|
118
|
+
if (!/라이선스|제외/.test(String(가중치.한국에서)))
|
|
119
|
+
return { 됨: false, 이유: "가중치 길의 「한국에서」 칸이 라이선스 제외를 말하지 않습니다 — 길만 보고 고른 사람은 라이선스 칸을 안 읽습니다" };
|
|
120
|
+
|
|
121
|
+
/* ── ③ 로컬 요구 — 부풀린 수치를 막는다 ──────────────────────── */
|
|
122
|
+
const R = d.로컬요구;
|
|
123
|
+
if (!R) return { 됨: false, 이유: "로컬요구 칸이 없습니다" };
|
|
124
|
+
for (const k of ["최소구성용량", "VRAM", "시스템RAM"])
|
|
125
|
+
if (!R[k]) return { 됨: false, 이유: `로컬요구의 "${k}" 칸이 비었습니다` };
|
|
126
|
+
const v = 첫숫자(R.VRAM);
|
|
127
|
+
if (!Number.isFinite(v)) return { 됨: false, 이유: "로컬요구의 VRAM 에서 숫자를 못 읽었습니다" };
|
|
128
|
+
if (v < VRAM최저)
|
|
129
|
+
return { 됨: false, 이유: `VRAM 을 ${v}GB 로 적었습니다 — 실측 기준선은 ${VRAM최저}GB 입니다(도는 말이 8GB 라 그대로 옮기기 쉽습니다)` };
|
|
130
|
+
|
|
131
|
+
/* ── ④ 벤치 — 보드와 상대 없이 「1위」라고 하면 과장이다 ───────── */
|
|
132
|
+
const B = d.벤치;
|
|
133
|
+
if (!B || !Array.isArray(B.결과) || !B.결과.length)
|
|
134
|
+
return { 됨: false, 이유: "벤치 결과가 비었습니다" };
|
|
135
|
+
if (!B.출처) return { 됨: false, 이유: "벤치 출처가 없습니다" };
|
|
136
|
+
for (const b of B.결과) {
|
|
137
|
+
if (!b?.보드) return { 됨: false, 이유: "어느 보드인지 없이 순위만 적힌 항목이 있습니다" };
|
|
138
|
+
if (!b?.순위) return { 됨: false, 이유: `「${b.보드}」 에 순위가 없습니다` };
|
|
139
|
+
if (!b?.상대) return { 됨: false, 이유: `「${b.보드}」 에 상대가 없습니다 — 누구를 이겼는지 없으면 「1위」는 빈말입니다` };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* ── ⑤ 금칙어 — 조건 없이 「완전 무료」를 말하지 않는다 ─────────── */
|
|
143
|
+
const 홍보문 = [
|
|
144
|
+
d.모델?.무엇, d.모델?.출력,
|
|
145
|
+
...길.map((w) => `${w.무엇} ${w.누구} ${w.주의}`),
|
|
146
|
+
].join(" ");
|
|
147
|
+
for (const re of 금칙)
|
|
148
|
+
if (re.test(홍보문))
|
|
149
|
+
return { 됨: false, 이유: `설명에 「${re.source}」 에 걸리는 말이 있습니다 — 조건 없이 단정하지 않습니다` };
|
|
150
|
+
|
|
151
|
+
/* ── ⑥ 안 하는 말 — 무엇을 뺐느냐가 원장의 절반이다 ───────────── */
|
|
152
|
+
if (!Array.isArray(d.안하는말) || !d.안하는말.length)
|
|
153
|
+
return { 됨: false, 이유: "「안하는말」 이 비었습니다 — 무엇을 안 말하는지가 원장의 절반입니다" };
|
|
154
|
+
for (const x of d.안하는말)
|
|
155
|
+
if (!x?.말 || !x?.이유) return { 됨: false, 이유: "「안하는말」 에 이유가 없는 항목이 있습니다" };
|
|
156
|
+
|
|
157
|
+
/* ── ⑦ 영상에서 소개한 순서가 실제 길에 있어야 한다 ──────────── */
|
|
158
|
+
const 키들 = new Set(길.map((w) => w.키));
|
|
159
|
+
for (const k of d.영상소개순서 || [])
|
|
160
|
+
if (!키들.has(k)) return { 됨: false, 이유: `영상에서 소개한 「${k}」 가 길 목록에 없습니다` };
|
|
161
|
+
|
|
162
|
+
return { 됨: true, 길수: 길.length, 제외: L.제외지역.length, 확인일: d.확인일 };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** 깔린 스킬이 실제로 읽히는지 — 머리말까지 확인한다. */
|
|
166
|
+
function 진짜도나() {
|
|
167
|
+
const md = join(대상, "SKILL.md");
|
|
168
|
+
if (!existsSync(md)) return { 됨: false, 이유: "SKILL.md 가 없습니다" };
|
|
169
|
+
const 본문 = readFileSync(md, "utf8");
|
|
170
|
+
if (!new RegExp("^---[\\s\\S]*?\\bname:\\s*" + 스킬이름 + "\\b", "m").test(본문))
|
|
171
|
+
return { 됨: false, 이유: "SKILL.md 머리말이 깨졌습니다(name 을 못 읽습니다)" };
|
|
172
|
+
return 원장검사(원장읽기(대상));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* ── ways ───────────────────────────────────────────────────────── */
|
|
176
|
+
function 길보기() {
|
|
177
|
+
const d = 원장읽기(existsSync(join(대상, "h3.json")) ? 대상 : 원본);
|
|
178
|
+
const r = 원장검사(d);
|
|
179
|
+
if (!r.됨) { console.error(`${c.r}✗ 원장이 이상합니다${c[0]} — ${r.이유}`); process.exit(1); }
|
|
180
|
+
머리말();
|
|
181
|
+
|
|
182
|
+
console.log(`${c.b}${d.모델.이름}${c[0]} ${c.d}· ${d.모델.파라미터} · 가중치 공개 ${d.모델.가중치공개일}${c[0]}`);
|
|
183
|
+
console.log(`${c.d}${d.모델.무엇}${c[0]}`);
|
|
184
|
+
console.log(`${c.d}출력 — ${d.모델.출력} · ${d.모델.길이} · ${d.모델.해상도}${c[0]}\n`);
|
|
185
|
+
|
|
186
|
+
console.log(`${c.r}${c.b}★ 먼저 볼 것 — 라이선스 제외 지역${c[0]}`);
|
|
187
|
+
console.log(` ${c.b}${d.라이선스.이름}${c[0]} ${c.d}· ${d.라이선스.성격}${c[0]}`);
|
|
188
|
+
console.log(` ${c.d}적용 범위 — "${d.라이선스.적용범위원문}"${c[0]}`);
|
|
189
|
+
console.log(` ${c.r}제외 — ${d.라이선스.제외지역.join(" · ")}${c[0]}`);
|
|
190
|
+
console.log(` ${c.y}${d.라이선스.그래서어떻게}${c[0]}\n`);
|
|
191
|
+
|
|
192
|
+
const 순 = d.영상소개순서 || [];
|
|
193
|
+
const 정렬 = [...d.길].sort((a, b) => 순.indexOf(a.키) - 순.indexOf(b.키));
|
|
194
|
+
정렬.forEach((w, i) => {
|
|
195
|
+
console.log(`${c.b}${i + 1}. ${w.이름}${c[0]} ${c.cy}${w.주소}${c[0]}`);
|
|
196
|
+
console.log(` ${c.d}${w.무엇}${c[0]}`);
|
|
197
|
+
console.log(` ${c.d}누구 — ${w.누구}${c[0]}`);
|
|
198
|
+
console.log(` ${c.d}한국에서 — ${c[0]}${w.키 === "weights" ? c.r : c.d}${w.한국에서}${c[0]}`);
|
|
199
|
+
console.log(` ${c.d}주의 — ${w.주의}${c[0]}`);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const R = d.로컬요구;
|
|
203
|
+
console.log(`\n${c.b}로컬로 돌리려면${c[0]}`);
|
|
204
|
+
console.log(` ${c.d}받을 것 ${c[0]}${c.y}${R.최소구성용량}${c[0]} ${c.d}— ${R.최소구성내역}${c[0]}`);
|
|
205
|
+
console.log(` ${c.d}VRAM ${c[0]}${c.y}${R.VRAM}${c[0]} ${c.d}· 시스템 RAM ${R.시스템RAM}${c[0]}`);
|
|
206
|
+
console.log(` ${c.d}${R.흔한오해}${c[0]}`);
|
|
207
|
+
|
|
208
|
+
console.log(`\n${c.b}순위${c[0]} ${c.d}(${d.벤치.출처} · ${d.확인일} 기준)${c[0]}`);
|
|
209
|
+
for (const b of d.벤치.결과)
|
|
210
|
+
console.log(` ${c.d}${b.보드.padEnd(24)}${c[0]}${c.b}${b.순위}${c[0]} ${c.d}(Elo ${b.elo} · ${b.상대})${c[0]}`);
|
|
211
|
+
console.log(` ${c.d}${d.벤치.주의}${c[0]}`);
|
|
212
|
+
|
|
213
|
+
console.log(`\n${c.b}이 스킬이 하지 않는 말${c[0]}`);
|
|
214
|
+
for (const x of d.안하는말) console.log(` ${c.r}✗${c[0]} ${x.말} ${c.d}— ${x.이유}${c[0]}`);
|
|
215
|
+
console.log(`\n${c.d}확인일 ${d.확인일}. 크레딧·단가·Elo 는 밖에서 바뀝니다 — 숫자를 박아 두지 않았습니다.${c[0]}\n`);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* ── verify (네트워크) ──────────────────────────────────────────── */
|
|
219
|
+
async function 확인명령() {
|
|
220
|
+
const d = 원장읽기(existsSync(join(대상, "h3.json")) ? 대상 : 원본);
|
|
221
|
+
const r = 원장검사(d);
|
|
222
|
+
if (!r.됨) { console.error(`${c.r}✗ 원장이 이상합니다${c[0]} — ${r.이유}`); process.exit(1); }
|
|
223
|
+
머리말();
|
|
224
|
+
console.log(`${c.d}네 갈래 주소가 지금 응답하는지 봅니다. 응답한다고 한국에서 쓸 수 있다는 뜻은 아닙니다 —${c[0]}`);
|
|
225
|
+
console.log(`${c.d}그건 라이선스 이야기이고, HTTP 로는 알 수 없습니다.${c[0]}\n`);
|
|
226
|
+
let 끊김 = 0;
|
|
227
|
+
for (const w of d.길) {
|
|
228
|
+
let 표, 말;
|
|
229
|
+
try {
|
|
230
|
+
const res = await fetch(w.주소, { redirect: "follow", signal: AbortSignal.timeout(20000) });
|
|
231
|
+
if (res.ok) { 표 = `${c.g}✓${c[0]}`; 말 = String(res.status); }
|
|
232
|
+
else { 표 = `${c.y}!${c[0]}`; 말 = String(res.status); 끊김++; }
|
|
233
|
+
} catch (e) { 표 = `${c.r}✗${c[0]}`; 말 = String(e.message).slice(0, 40); 끊김++; }
|
|
234
|
+
console.log(` ${표} ${w.이름.padEnd(24)} ${c.d}${말}${c[0]}`);
|
|
235
|
+
}
|
|
236
|
+
console.log(끊김
|
|
237
|
+
? `\n${c.y}${끊김}건이 응답하지 않습니다 — 원장을 다시 봐야 합니다.${c[0]}\n`
|
|
238
|
+
: `\n${c.g}네 갈래 전부 응답합니다.${c[0]} ${c.d}(쓸 수 있다는 증명은 아닙니다)${c[0]}\n`);
|
|
239
|
+
process.exit(끊김 ? 1 : 0);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* ── --check ────────────────────────────────────────────────────── */
|
|
243
|
+
function 확인만() {
|
|
244
|
+
머리말();
|
|
245
|
+
const r = 진짜도나();
|
|
246
|
+
if (r.됨) {
|
|
247
|
+
console.log(`${c.g}✓ 설치되어 있고 원장이 규칙을 지킵니다${c[0]} ${c.d}(${대상})${c[0]}`);
|
|
248
|
+
console.log(`${c.d} 길 ${r.길수}갈래 · 라이선스 제외 지역 ${r.제외}곳 명시 · 확인일 ${r.확인일}${c[0]}\n`);
|
|
249
|
+
} else console.log(`${c.y}· 아직 없습니다${c[0]} ${c.d}— ${r.이유}${c[0]}\n`);
|
|
250
|
+
process.exit(r.됨 ? 0 : 1);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* ── 자기시험 (네트워크 안 씀) ─────────────────────────────────── */
|
|
254
|
+
function 자기시험() {
|
|
255
|
+
const 결과 = [];
|
|
256
|
+
const T = (n, ok) => 결과.push([n, !!ok]);
|
|
257
|
+
const 원 = 원장읽기(원본);
|
|
258
|
+
const 복 = () => JSON.parse(JSON.stringify(원));
|
|
259
|
+
|
|
260
|
+
T("패키지 안에 skill/h3.json 이 있다", !!원);
|
|
261
|
+
T("★정본 원장이 검사를 통과한다", 원장검사(원).됨);
|
|
262
|
+
T("★라이선스 제외 지역에 대한민국이 있다", (원?.라이선스?.제외지역 || []).includes(반드시제외));
|
|
263
|
+
T("★적용 범위 원문이 그대로 남아 있다", /excluding/i.test(원?.라이선스?.적용범위원문 || ""));
|
|
264
|
+
T("★길이 정확히 4갈래다", 원?.길?.length === 4);
|
|
265
|
+
T("★영상 소개 순서가 전부 실제 길에 있다", (() => {
|
|
266
|
+
const 키 = new Set((원?.길 || []).map((w) => w.키));
|
|
267
|
+
return (원?.영상소개순서 || []).length === 4 && (원.영상소개순서).every((k) => 키.has(k));
|
|
268
|
+
})());
|
|
269
|
+
T("★로컬 VRAM 기준선이 12GB 이상이다", 첫숫자(원?.로컬요구?.VRAM) >= VRAM최저);
|
|
270
|
+
T("★벤치 결과마다 보드와 상대가 붙어 있다",
|
|
271
|
+
(원?.벤치?.결과 || []).every((b) => b.보드 && b.순위 && b.상대));
|
|
272
|
+
T("★「안하는말」 에 이유가 전부 적혀 있다", (원?.안하는말 || []).every((x) => x.말 && x.이유));
|
|
273
|
+
T("★SKILL.md 가 옆에 있고 name 이 맞다", (() => {
|
|
274
|
+
const f = join(원본, "SKILL.md");
|
|
275
|
+
return existsSync(f) && new RegExp("^---[\\s\\S]*?\\bname:\\s*" + 스킬이름 + "\\b", "m").test(readFileSync(f, "utf8"));
|
|
276
|
+
})());
|
|
277
|
+
T("★SKILL.md 가 h3.json 을 읽으라고 못 박는다",
|
|
278
|
+
readFileSync(join(원본, "SKILL.md"), "utf8").includes("h3.json"));
|
|
279
|
+
T("★SKILL.md 가 제외 지역을 먼저 말하라고 적어 뒀다",
|
|
280
|
+
/제외\s*지역/.test(readFileSync(join(원본, "SKILL.md"), "utf8")));
|
|
281
|
+
T("★package.json files 에 skill/ 과 안내스킬.md 가 들어 있다", (() => {
|
|
282
|
+
const pj = join(여기, "package.json");
|
|
283
|
+
if (!existsSync(pj)) return false;
|
|
284
|
+
const f = JSON.parse(readFileSync(pj, "utf8")).files || [];
|
|
285
|
+
return f.includes("skill/") && f.includes("안내스킬.md");
|
|
286
|
+
})());
|
|
287
|
+
T("★안내스킬.md 가 스킬팩을 말한다", (() => {
|
|
288
|
+
const f = join(여기, "안내스킬.md");
|
|
289
|
+
return existsSync(f) && /스킬팩|rebornlabs\.kr\/skillpack/.test(readFileSync(f, "utf8"));
|
|
290
|
+
})());
|
|
291
|
+
T("★안내스킬.md 가 클로드킷을 말하지 않는다(계단 유지)", (() => {
|
|
292
|
+
const f = join(여기, "안내스킬.md");
|
|
293
|
+
if (!existsSync(f)) return false;
|
|
294
|
+
return !/클로드킷|자비스\s*풀스택|rebornlabs\.kr\/(claudekit|kit|jarvis)/.test(readFileSync(f, "utf8"));
|
|
295
|
+
})());
|
|
296
|
+
|
|
297
|
+
/* ── ★역시험 — 일부러 깨뜨려 본다. 여기서 통과하면 검사기가 고장난 것이다. ── */
|
|
298
|
+
T("★★제외 지역에서 대한민국을 지우면 잡는다", (() => {
|
|
299
|
+
const d = 복(); d.라이선스.제외지역 = d.라이선스.제외지역.filter((x) => x !== 반드시제외);
|
|
300
|
+
return !원장검사(d).됨;
|
|
301
|
+
})());
|
|
302
|
+
T("★★제외 지역을 통째로 비우면 잡는다", (() => {
|
|
303
|
+
const d = 복(); d.라이선스.제외지역 = []; return !원장검사(d).됨;
|
|
304
|
+
})());
|
|
305
|
+
T("★★적용 범위 원문을 번역만 남기면 잡는다", (() => {
|
|
306
|
+
const d = 복(); d.라이선스.적용범위원문 = "전 세계(일부 지역 제외)";
|
|
307
|
+
return !원장검사(d).됨;
|
|
308
|
+
})());
|
|
309
|
+
T("★★「그래서 어떻게」를 지우면 잡는다", (() => {
|
|
310
|
+
const d = 복(); delete d.라이선스.그래서어떻게; return !원장검사(d).됨;
|
|
311
|
+
})());
|
|
312
|
+
T("★★VRAM 을 8GB 로 적으면 잡는다", (() => {
|
|
313
|
+
const d = 복(); d.로컬요구.VRAM = "8GB"; return !원장검사(d).됨;
|
|
314
|
+
})());
|
|
315
|
+
T("★★시스템 RAM 을 지우면 잡는다", (() => {
|
|
316
|
+
const d = 복(); d.로컬요구.시스템RAM = ""; return !원장검사(d).됨;
|
|
317
|
+
})());
|
|
318
|
+
T("★★벤치에서 상대를 지우면 잡는다", (() => {
|
|
319
|
+
const d = 복(); delete d.벤치.결과[0].상대; return !원장검사(d).됨;
|
|
320
|
+
})());
|
|
321
|
+
T("★★벤치에서 보드 이름을 지우면 잡는다", (() => {
|
|
322
|
+
const d = 복(); delete d.벤치.결과[1].보드; return !원장검사(d).됨;
|
|
323
|
+
})());
|
|
324
|
+
T("★★길을 3갈래로 줄이면 잡는다", (() => { const d = 복(); d.길.pop(); return !원장검사(d).됨; })());
|
|
325
|
+
T("★★길을 5갈래로 늘리면 잡는다", (() => {
|
|
326
|
+
const d = 복(); d.길.push({ ...d.길[0], 키: "x" }); return !원장검사(d).됨;
|
|
327
|
+
})());
|
|
328
|
+
T("★★길의 칸을 비우면 잡는다", (() => { const d = 복(); d.길[1].주의 = ""; return !원장검사(d).됨; })());
|
|
329
|
+
T("★★가중치 길의 「한국에서」 에서 라이선스 이야기를 빼면 잡는다", (() => {
|
|
330
|
+
const d = 복();
|
|
331
|
+
d.길.find((w) => w.키 === "weights").한국에서 = "잘 됩니다";
|
|
332
|
+
return !원장검사(d).됨;
|
|
333
|
+
})());
|
|
334
|
+
T("★★가중치 길 자체를 없애면 잡는다", (() => {
|
|
335
|
+
const d = 복(); d.길 = d.길.filter((w) => w.키 !== "weights");
|
|
336
|
+
d.길.push({ ...d.길[0], 키: "여분" });
|
|
337
|
+
return !원장검사(d).됨;
|
|
338
|
+
})());
|
|
339
|
+
T("★★http 주소를 넣으면 잡는다", (() => {
|
|
340
|
+
const d = 복(); d.길[0].주소 = "http://hub.minimax.io/"; return !원장검사(d).됨;
|
|
341
|
+
})());
|
|
342
|
+
T("★★설명에 「완전 무료」를 넣으면 잡는다", (() => {
|
|
343
|
+
const d = 복(); d.길[0].무엇 = "완전 무료로 영상을 만든다"; return !원장검사(d).됨;
|
|
344
|
+
})());
|
|
345
|
+
T("★★설명에 「무제한」을 넣으면 잡는다", (() => {
|
|
346
|
+
const d = 복(); d.길[1].주의 = "무제한으로 쓸 수 있다"; return !원장검사(d).됨;
|
|
347
|
+
})());
|
|
348
|
+
T("★★설명에 「검열 없음」을 넣으면 잡는다", (() => {
|
|
349
|
+
const d = 복(); d.모델.무엇 = "검열이 없는 영상 모델"; return !원장검사(d).됨;
|
|
350
|
+
})());
|
|
351
|
+
T("★★「안하는말」 을 비우면 잡는다", (() => { const d = 복(); d.안하는말 = []; return !원장검사(d).됨; })());
|
|
352
|
+
T("★★확인일을 지우면 잡는다", (() => { const d = 복(); delete d.확인일; return !원장검사(d).됨; })());
|
|
353
|
+
T("★★영상 소개 순서에 없는 키를 넣으면 잡는다", (() => {
|
|
354
|
+
const d = 복(); d.영상소개순서 = [...d.영상소개순서, "없는길"]; return !원장검사(d).됨;
|
|
355
|
+
})());
|
|
356
|
+
T("★없는 원장은 통과하지 않는다", !원장검사(null).됨);
|
|
357
|
+
|
|
358
|
+
for (const [n, ok] of 결과) console.log(` ${ok ? c.g + "✓" : c.r + "✗"}${c[0]} ${n}`);
|
|
359
|
+
const 실패 = 결과.filter(([, ok]) => !ok).length;
|
|
360
|
+
console.log(실패 ? `\n${c.r}✗ 자기시험 ${실패}건 실패${c[0]}` : `\n${c.g}✓ 자기시험 ${결과.length}건 통과${c[0]}`);
|
|
361
|
+
return 실패 ? 1 : 0;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* ── 설치 ───────────────────────────────────────────────────────── */
|
|
365
|
+
function 설치() {
|
|
366
|
+
머리말();
|
|
367
|
+
if (!existsSync(원본)) {
|
|
368
|
+
console.error(`${c.r}✗ 패키지 안에 skill/ 폴더가 없습니다${c[0]} — 배포가 잘못된 것입니다.`);
|
|
369
|
+
process.exit(2);
|
|
370
|
+
}
|
|
371
|
+
let 쓴수 = 0;
|
|
372
|
+
for (const src of 파일목록(원본)) {
|
|
373
|
+
const 상대 = relative(원본, src);
|
|
374
|
+
const dst = join(대상, 상대);
|
|
375
|
+
mkdirSync(dirname(dst), { recursive: true });
|
|
376
|
+
writeFileSync(dst, readFileSync(src));
|
|
377
|
+
쓴수++;
|
|
378
|
+
console.log(` ${c.d}·${c[0]} ${상대}`);
|
|
379
|
+
}
|
|
380
|
+
console.log(`\n${c.d}${쓴수}개 파일 → ${대상}${c[0]}`);
|
|
381
|
+
console.log(`${c.d}원장이 조건을 숨기지 않았는지 다시 확인하는 중…${c[0]}`);
|
|
382
|
+
|
|
383
|
+
const r = 진짜도나();
|
|
384
|
+
if (!r.됨) {
|
|
385
|
+
console.error(`\n${c.r}✗ 깔았는데 확인에서 걸렸습니다${c[0]} — ${r.이유}\n`);
|
|
386
|
+
process.exit(1);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
const d = 원장읽기(대상);
|
|
390
|
+
console.log(`\n${c.g}${c.b}✓ 설치 완료${c[0]} ${c.d}— 길 ${r.길수}갈래 (확인일 ${r.확인일})${c[0]}`);
|
|
391
|
+
|
|
392
|
+
console.log(`\n${c.r}${c.b}★ 먼저 아셔야 할 것${c[0]}`);
|
|
393
|
+
console.log(` ${c.d}${d.라이선스.이름} 의 적용 범위는 ${c[0]}"${d.라이선스.적용범위원문}"${c.d} 입니다.${c[0]}`);
|
|
394
|
+
console.log(` ${c.r}제외 지역 — ${d.라이선스.제외지역.join(" · ")}${c[0]}`);
|
|
395
|
+
console.log(` ${c.d}${d.라이선스.그래서어떻게}${c[0]}`);
|
|
396
|
+
|
|
397
|
+
console.log(`\n${c.y}★ 클로드 코드를 껐다 켜야 스킬이 잡힙니다.${c[0]}`);
|
|
398
|
+
console.log(`\n${c.b}쓰는 법${c[0]}`);
|
|
399
|
+
console.log(` 클로드에게 그냥 말하세요 — ${c.cy}"미니맥스 H3 나한테 맞는 길 골라줘"${c[0]}`);
|
|
400
|
+
console.log(` 터미널에서 네 갈래 전부: ${c.cy}npx reborn-minimax-h3 ways${c[0]}`);
|
|
401
|
+
console.log(` 주소가 아직 사는지: ${c.cy}npx reborn-minimax-h3 verify${c[0]}`);
|
|
402
|
+
console.log(` ${c.d}크레딧·단가·Elo 는 밖에서 바뀝니다. 숫자를 박아 두지 않은 이유입니다.${c[0]}\n`);
|
|
403
|
+
console.log(`${c.d}설명 · https://rebornlabs.kr/minimax?utm_source=installer&utm_medium=cli&utm_campaign=${퍼널}${c[0]}`);
|
|
404
|
+
|
|
405
|
+
/* ★끝난 뒤 딱 한 칸. 못 깔았으면 여기까지 오지 않는다(위에서 exit 1).
|
|
406
|
+
★가리키는 곳은 스킬팩(8,900원)이다. 클로드킷은 여기서 말하지 않는다 — 계단이 무너진다. */
|
|
407
|
+
const t = TAIL[퍼널];
|
|
408
|
+
console.log("");
|
|
409
|
+
for (const 줄 of t.이음) console.log(`${c.d}${줄.replace(/\*\*(.+?)\*\*/g, `${c[0]}${c.b}$1${c[0]}${c.d}`)}${c[0]}`);
|
|
410
|
+
console.log(`\n${c.b}${t.제목}${c[0]}${c.d} — ${t.한줄}${c[0]}`);
|
|
411
|
+
console.log(`${c.cy}${링크(퍼널)}${c[0]}`);
|
|
412
|
+
console.log(`${c.d}${마지막}${c[0]}\n`);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/* ══ 실행 ═══════════════════════════════════════════════════════ */
|
|
416
|
+
const 인자 = process.argv.slice(2);
|
|
417
|
+
const 첫 = 인자[0];
|
|
418
|
+
if (인자.includes("--self-test")) process.exit(자기시험());
|
|
419
|
+
else if (첫 === "ways" || 첫 === "길") 길보기();
|
|
420
|
+
else if (첫 === "verify" || 첫 === "확인") await 확인명령();
|
|
421
|
+
else if (인자.includes("--check")) 확인만();
|
|
422
|
+
else 설치();
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reborn-minimax-h3",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "미니맥스 H3(MiniMax-H3) — 영상과 소리를 한 번에 만드는 오픈 가중치 모델을 지금 상황에서 어느 길로 쓸지 골라 주고, 한국에서 걸리는 라이선스 조건과 로컬 구동에 실제로 필요한 사양을 먼저 알려 주는 클로드 코드 스킬.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"claude",
|
|
7
|
+
"claude-code",
|
|
8
|
+
"agent-skills",
|
|
9
|
+
"skill",
|
|
10
|
+
"minimax",
|
|
11
|
+
"minimax-h3",
|
|
12
|
+
"hailuo",
|
|
13
|
+
"video-generation",
|
|
14
|
+
"open-weights",
|
|
15
|
+
"text-to-video",
|
|
16
|
+
"image-to-video",
|
|
17
|
+
"ai-video"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://rebornlabs.kr/minimax?utm_source=installer&utm_medium=cli&utm_campaign=minimax",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://mobility.rebornlabs.kr/cs"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"author": "REBORN LABS",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"bin": {
|
|
27
|
+
"reborn-minimax-h3": "cli.mjs"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"cli.mjs",
|
|
31
|
+
"tail.mjs",
|
|
32
|
+
"skill/",
|
|
33
|
+
"README.md",
|
|
34
|
+
"안내스킬.md"
|
|
35
|
+
],
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"test": "node cli.mjs --self-test",
|
|
41
|
+
"check": "node cli.mjs --check"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: minimax-h3
|
|
3
|
+
description: >
|
|
4
|
+
미니맥스 H3(MiniMax-H3) — 영상과 소리를 한 번에 만드는 오픈 가중치 옴니모달 모델을
|
|
5
|
+
지금 상황에서 **어느 길로 쓸지** 골라 주고, 한국에서 걸리는 라이선스 조건과
|
|
6
|
+
로컬 구동에 실제로 필요한 사양을 먼저 알려 준다.
|
|
7
|
+
"미니맥스", "MiniMax H3", "H3", "하이루오", "Hailuo", "오픈소스 영상 모델",
|
|
8
|
+
"무료 AI 영상", "로컬로 영상 생성", "소라 대신", "veo 대신 무료",
|
|
9
|
+
"영상에 소리까지 한 번에", "이거 상업적으로 써도 되나" 같은 이야기가 나올 때 쓴다.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# 미니맥스 H3 — 어느 길로 쓸 것인가
|
|
13
|
+
|
|
14
|
+
> 이 스킬은 **리본랩스(REBORN LABS)** 의 무료 설치기가 넣은 것입니다.
|
|
15
|
+
> 필요 없으시면 이 폴더를 지우세요.
|
|
16
|
+
|
|
17
|
+
사실 정본은 옆의 **`h3.json`** 입니다. 답할 때는 **반드시 그 파일을 읽고** 말하세요.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 이 스킬이 지키는 것 네 가지
|
|
22
|
+
|
|
23
|
+
### ① ★라이선스 제외 지역을 **먼저** 말한다
|
|
24
|
+
|
|
25
|
+
`MiniMax H3 Community License` 는 적용 범위를
|
|
26
|
+
**"Worldwide, excluding the Excluded Territories"** 로 적고,
|
|
27
|
+
제외 지역에 **유럽연합 · 영국 · 대한민국 · 미국**을 넣었습니다.
|
|
28
|
+
|
|
29
|
+
사용자가 한국에 있다면 **가중치를 받아 상업적으로 쓰는 길은 그대로 권하지 않습니다.**
|
|
30
|
+
「무료·오픈소스」라는 말이 먼저 나가고 이 줄이 나중에 나가면, 사람은 이미
|
|
31
|
+
42.5GB 를 내려받은 뒤입니다. **좋은 소식보다 조건을 먼저 놓으세요.**
|
|
32
|
+
|
|
33
|
+
권할 때 이렇게 말하세요 —
|
|
34
|
+
「가중치 라이선스는 한국을 제외 지역으로 두고 있습니다. 대신 MiniMax 가
|
|
35
|
+
직접 운영하는 웹 서비스로 써 보시고, 상업적으로 쓰셔야 하면 별도 라이선스를
|
|
36
|
+
문의하시는 게 정석입니다.」
|
|
37
|
+
|
|
38
|
+
### ② 「무료」와 「무제한」을 섞어 말하지 않는다
|
|
39
|
+
|
|
40
|
+
가중치는 로열티 프리이지만 제외 지역이 있고, 웹 서비스는 각자 크레딧 정책이 있습니다.
|
|
41
|
+
그래서 이 목록에는 **크레딧·단가 숫자를 박아 두지 않았습니다.**
|
|
42
|
+
성격만 말하고, 정확한 값은 **"서비스 안에서 지금 값을 보세요"** 로 넘기세요.
|
|
43
|
+
|
|
44
|
+
### ③ `h3.json` 의 `안하는말` 을 그대로 지킨다
|
|
45
|
+
|
|
46
|
+
인터넷과 릴스에 도는 말 중 **사실이 아닌 것 다섯 개**를 `안하는말` 에 적어 두었습니다.
|
|
47
|
+
사용자가 그 말을 꺼내면 **바로잡아 주세요.** 특히:
|
|
48
|
+
|
|
49
|
+
- 「VRAM 8GB 면 된다」 → 실측 기준선은 **12GB + 시스템 RAM 64GB**
|
|
50
|
+
- 「구글을 다 이겼다」 → **영상 편집 보드 1위**가 맞고, 텍스트→영상은 **2위**(3 Elo 차)
|
|
51
|
+
- 「검열이 없다」 → 커뮤니티 라이선스에 사용 제한 조항이 있습니다
|
|
52
|
+
|
|
53
|
+
### ④ 숫자에 **확인일**을 붙인다
|
|
54
|
+
|
|
55
|
+
Elo 와 순위는 표본이 쌓이면서 움직입니다. `h3.json` 의 `확인일` 을 함께 말하고,
|
|
56
|
+
"지금 값은 보드에서 직접 보세요"를 붙이세요.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 길 고르기 — 네 개뿐입니다
|
|
61
|
+
|
|
62
|
+
`h3.json` 의 `길` 배열을 읽고 사용자 상황에 맞는 **하나**를 고르세요.
|
|
63
|
+
|
|
64
|
+
| 사용자가 이렇게 말하면 | 이 길 |
|
|
65
|
+
|---|---|
|
|
66
|
+
| "일단 뭐가 나오는지 보고 싶다" | **MiniMax Hub** — 브라우저에서 바로 |
|
|
67
|
+
| "만든 걸 콘텐츠에 바로 쓰겠다" | **Hailuo AI** — 서비스 약관 확인 후 |
|
|
68
|
+
| "내 자동화 파이프라인에 붙이겠다" | **fal.ai 호스팅 API** — 유일하게 API 가 있는 길 |
|
|
69
|
+
| "내 GPU 에서 직접 돌리겠다" | **가중치** — ★한국이면 라이선스부터 |
|
|
70
|
+
|
|
71
|
+
**두 개를 같이 권하지 마세요.** 사람은 두 개를 주면 둘 다 안 합니다.
|
|
72
|
+
하나를 고르고, 왜 그걸 골랐는지 한 줄로 말하세요.
|
|
73
|
+
|
|
74
|
+
## 로컬을 물어보면
|
|
75
|
+
|
|
76
|
+
`로컬요구` 를 읽고 **용량부터** 말하세요 — 최소 구성이 **42.5GB** 입니다.
|
|
77
|
+
받는 데만 한참 걸립니다. 그다음이 VRAM **12GB** + 시스템 RAM **약 64GB** 이고,
|
|
78
|
+
오프로딩을 쓰면 **렌더가 느려지는 걸 감수**해야 합니다.
|
|
79
|
+
|
|
80
|
+
이 순서가 중요합니다. VRAM 부터 말하면 "내 카드 되네" 하고 받기 시작합니다.
|
|
81
|
+
|
|
82
|
+
## 무엇을 만들 수 있나
|
|
83
|
+
|
|
84
|
+
- 텍스트만으로 (`fl2va`)
|
|
85
|
+
- 텍스트 + **첫 프레임/끝 프레임 이미지** (`fl2va`) — 시작과 끝을 정해 놓고 사이를 채운다
|
|
86
|
+
- **참고 이미지·영상·오디오** 여러 개를 넣고 그걸 따라 (`ref2va`)
|
|
87
|
+
|
|
88
|
+
셋 다 **소리가 같이 나옵니다.** 환경음·폴리·음성이 영상과 같은 패스에서 만들어집니다.
|
|
89
|
+
후반에 소리를 따로 붙이는 작업이 통째로 빠지는 게 이 모델의 값입니다.
|
|
90
|
+
|
|
91
|
+
길이는 **5~15초**, 기본 캔버스는 **단변 768px** 입니다.
|
|
92
|
+
2K 가 필요하면 `H3-Regenerate-2K` 라는 **2차 재생성 패스**를 한 번 더 태웁니다.
|
|
93
|
+
|
|
94
|
+
## 관련
|
|
95
|
+
|
|
96
|
+
- 설명 · <https://rebornlabs.kr/minimax?utm_source=skill&utm_medium=doc&utm_campaign=minimax>
|
package/skill/h3.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"판": "1.0.0",
|
|
3
|
+
"확인일": "2026-08-26",
|
|
4
|
+
"확인방법": "MiniMax 공식 공개 발표(2026-08-03) · Hugging Face 모델 카드 · MiniMax H3 Community License 본문 · Artificial Analysis 아레나 순위를 그날 직접 확인했다. 순위와 Elo 는 표본이 쌓이면서 움직인다 — 그래서 '확인일 기준'을 반드시 함께 말한다.",
|
|
5
|
+
|
|
6
|
+
"모델": {
|
|
7
|
+
"이름": "MiniMax-H3",
|
|
8
|
+
"만든곳": "MiniMax",
|
|
9
|
+
"발표일": "2026-07-31",
|
|
10
|
+
"가중치공개일": "2026-08-03",
|
|
11
|
+
"파라미터": "33B",
|
|
12
|
+
"파라미터주의": "그중 약 13B 는 AdaLN 변조 분기라 추론 때는 올리지 않아도 된다. 영상 화면의 '338 parameter' 는 오기다.",
|
|
13
|
+
"무엇": "텍스트·이미지·영상·오디오를 함께 이해하고, 영상과 소리를 한 번에 만들어 내는 옴니모달 생성 모델",
|
|
14
|
+
"출력": "네이티브 스테레오 오디오가 붙은 영상 (환경음·폴리·음성이 같은 패스에서 나온다)",
|
|
15
|
+
"길이": "5~15초",
|
|
16
|
+
"해상도": "기본 캔버스 단변 768px (최대 768×1344). 2K 는 H3-Regenerate-2K 라는 2차 재생성 패스로 올린다",
|
|
17
|
+
"체크포인트": [
|
|
18
|
+
{ "이름": "fl2va", "무엇": "텍스트 + (선택) 첫 프레임/끝 프레임 이미지로 만든다", "용량": "20.97GB (int8 pruned)" },
|
|
19
|
+
{ "이름": "ref2va", "무엇": "참고 이미지·영상·오디오를 여러 개 넣고 그걸 따라 만든다", "용량": "20.97GB (int8 pruned)" }
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
"라이선스": {
|
|
24
|
+
"이름": "MiniMax H3 Community License",
|
|
25
|
+
"성격": "로열티 프리. 연구와 상업 이용 모두 허용",
|
|
26
|
+
"적용범위원문": "Worldwide, excluding the Excluded Territories",
|
|
27
|
+
"제외지역": ["유럽연합", "영국", "대한민국", "미국"],
|
|
28
|
+
"왜중요한가": "우리 시청자는 대부분 한국에 있다. 「무료·오픈소스」라는 말만 옮기고 이 조항을 빼면, 받아서 상업적으로 쓰다가 라이선스 밖에 서게 된다. 좋은 소식보다 이 줄을 먼저 말한다.",
|
|
29
|
+
"그래서어떻게": "가중치를 내려받아 직접 돌리는 길은 한국에서 그대로 권하지 않는다. 대신 MiniMax 가 직접 운영하는 웹 서비스(각자 자기 약관을 따른다)로 안내한다. 상업적으로 써야 하면 MiniMax 에 별도 라이선스를 문의하는 것이 정석이다."
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
"길": [
|
|
33
|
+
{
|
|
34
|
+
"키": "hub",
|
|
35
|
+
"이름": "MiniMax Hub",
|
|
36
|
+
"주소": "https://hub.minimax.io/",
|
|
37
|
+
"무엇": "브라우저에서 바로 H3 로 영상을 만들어 본다. 설치도 GPU 도 필요 없다",
|
|
38
|
+
"누구": "일단 뭐가 나오는지부터 보고 싶은 사람",
|
|
39
|
+
"한국에서": "서비스 약관을 따른다 — 가중치 라이선스의 제외 지역 조항과는 별개다",
|
|
40
|
+
"주의": "무료 크레딧과 대기열 정책은 서비스 안에서 바뀐다. 숫자를 여기에 적지 않는다"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"키": "hailuo",
|
|
44
|
+
"이름": "Hailuo AI",
|
|
45
|
+
"주소": "https://hailuoai.video/",
|
|
46
|
+
"무엇": "MiniMax 가 운영하는 영상 생성 서비스. H3 를 도구로 골라 쓴다",
|
|
47
|
+
"누구": "결과물을 바로 콘텐츠에 쓰려는 사람",
|
|
48
|
+
"한국에서": "서비스 약관을 따른다",
|
|
49
|
+
"주의": "출력물의 상업적 이용 조건은 서비스 약관에서 확인할 것"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"키": "fal",
|
|
53
|
+
"이름": "fal.ai (호스팅 API)",
|
|
54
|
+
"주소": "https://fal.ai/minimax-h3",
|
|
55
|
+
"무엇": "API 로 호출한다. 우리 파이프라인에 붙일 수 있는 유일한 길",
|
|
56
|
+
"누구": "자동화에 넣으려는 사람",
|
|
57
|
+
"한국에서": "제3자 호스팅이다 — 과금과 이용 조건은 fal 약관을 따른다",
|
|
58
|
+
"주의": "종량 과금이다. 단가는 자주 바뀌므로 여기에 적지 않는다"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"키": "weights",
|
|
62
|
+
"이름": "가중치 직접 (Hugging Face)",
|
|
63
|
+
"주소": "https://huggingface.co/MiniMaxAI/MiniMax-H3",
|
|
64
|
+
"무엇": "가중치를 받아 내 GPU 에서 돌린다",
|
|
65
|
+
"누구": "제외 지역 밖에 있거나, 별도 라이선스를 받은 사람",
|
|
66
|
+
"한국에서": "★커뮤니티 라이선스의 제외 지역이다 — 그대로 상업적으로 쓰기 전에 확인이 필요하다",
|
|
67
|
+
"주의": "최소 42.5GB 를 받아야 한 벌이 된다"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
|
|
71
|
+
"로컬요구": {
|
|
72
|
+
"최소구성용량": "42.5GB",
|
|
73
|
+
"최소구성내역": "체크포인트 1종(20.97GB) + 텍스트 인코더 nvfp4 AWQ(15.69GB) + 비디오 VAE(5.21GB) + 오디오 VAE(0.61GB)",
|
|
74
|
+
"VRAM": "12GB (동적 오프로딩을 켠 경우)",
|
|
75
|
+
"시스템RAM": "약 64GB",
|
|
76
|
+
"느려짐": "오프로딩을 쓰면 렌더 시간이 길어지는 걸 감수해야 한다",
|
|
77
|
+
"전정밀도": "bf16 전체 구성은 약 123.6GB",
|
|
78
|
+
"흔한오해": "「그래픽카드 여덟 기가면 돌아간다」는 말이 도는데 실측 기준선은 12GB + 시스템 RAM 64GB 다. 그 말을 믿고 시작하면 42.5GB 를 다 내려받은 뒤에 못 돌린다"
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
"벤치": {
|
|
82
|
+
"출처": "Artificial Analysis 아레나",
|
|
83
|
+
"주의": "Elo 는 표본이 쌓이면서 움직인다. 여기 적힌 값은 확인일 기준이고, 지금 값은 보드에서 직접 봐야 한다",
|
|
84
|
+
"결과": [
|
|
85
|
+
{ "보드": "영상 편집 (오디오 포함)", "순위": "1위", "elo": 1130, "상대": "2위 Gemini Omni Flash 1122" },
|
|
86
|
+
{ "보드": "텍스트→영상 (오디오 포함)", "순위": "2위", "elo": 1238, "상대": "1위 Gemini Omni Flash 1241" },
|
|
87
|
+
{ "보드": "이미지→영상 (오디오 포함)", "순위": "전체 2위 · 오픈웨이트 중 1위", "elo": 1185, "상대": "1위 Dreamina Seedance 2.0 720p 1192" }
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
"영상소개순서": ["hub", "hailuo", "fal", "weights"],
|
|
92
|
+
|
|
93
|
+
"안하는말": [
|
|
94
|
+
{ "말": "검열이 없다", "이유": "커뮤니티 라이선스에 사용 제한 조항이 있다. 「검열 없음」은 라이선스를 안 읽은 말이다" },
|
|
95
|
+
{ "말": "완전 무료", "이유": "가중치는 로열티 프리지만 제외 지역이 있고, 웹 서비스는 각자 크레딧 정책이 있다. 조건 없이 「완전 무료」라고 하면 거짓이 된다" },
|
|
96
|
+
{ "말": "립싱크·작곡까지 된다", "이유": "네이티브 스테레오 오디오를 같은 패스에서 내는 것이 확인된 사실이다. 별도 립싱크 기능이나 작곡 기능은 공식 문서에 없다" },
|
|
97
|
+
{ "말": "그래픽카드 여덟 기가면 된다", "이유": "실측 기준선은 VRAM 12GB + 시스템 RAM 64GB 다" },
|
|
98
|
+
{ "말": "구글을 다 이겼다", "이유": "영상 편집 보드는 1위가 맞지만 텍스트→영상은 2위이고 격차가 3 Elo 다. 보드를 밝히지 않고 「이겼다」고 하면 과장이다" }
|
|
99
|
+
]
|
|
100
|
+
}
|
package/tail.mjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「끝난 뒤 한 칸」 문안 — **정본은 `skillpack/tail_copy.mjs` 다.**
|
|
3
|
+
*
|
|
4
|
+
* 여기 사본이 있는 이유는 하나뿐이다: npm 패키지는 폴더 밖을 import 할 수 없다.
|
|
5
|
+
* 문구를 고칠 일이 생기면 **정본을 먼저 고치고** 이 파일에 옮긴다. 반대로 하지 마라.
|
|
6
|
+
*
|
|
7
|
+
* 규율(정본에서 그대로 온다):
|
|
8
|
+
* ① 끝난 뒤 딱 한 칸 · ② 못 깔았으면 안 띄운다 · ③ 파일을 남기지 않는다
|
|
9
|
+
* ④ 고지 블록 금지 — 대신 마지막 줄에서 목록과 직접 까는 법을 알려 준다
|
|
10
|
+
* ⑤ 첫 줄은 **방금 한 일에서 이어져야** 한다.
|
|
11
|
+
*/
|
|
12
|
+
export const 랜딩 = "https://rebornlabs.kr/skillpack";
|
|
13
|
+
|
|
14
|
+
export const 링크 = (퍼널) =>
|
|
15
|
+
`${랜딩}?utm_source=installer&utm_medium=cli&utm_campaign=${퍼널}`;
|
|
16
|
+
|
|
17
|
+
export const TAIL = {
|
|
18
|
+
minimax: {
|
|
19
|
+
이음: [
|
|
20
|
+
"방금 드린 건 **길을 고르는 눈**입니다 — 네 갈래 중 지금 갈 하나와, 한국에서 걸리는 조건까지.",
|
|
21
|
+
"모델을 정하고 나면 다음 질문은 대개 **\"그래서 이걸 매번 누가 돌리지\"** 입니다.",
|
|
22
|
+
],
|
|
23
|
+
제목: "리본랩스 스킬팩",
|
|
24
|
+
한줄: "같은 방식으로 골라 담은 48종을 한 줄로. 8,900원",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const 마지막 = "목록과 직접 까는 명령까지 그 페이지에 그대로 적어 두었습니다. 안 사셔도 됩니다.";
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reborn-minimax-h3-guide
|
|
3
|
+
description: >
|
|
4
|
+
미니맥스 H3 를 쓰기 전에 무엇을 먼저 확인해야 하는지, 「무료·오픈소스」가
|
|
5
|
+
한국에서 어디까지를 뜻하는지, 로컬로 돌리려면 실제로 무엇이 필요한지 알려 준다.
|
|
6
|
+
"미니맥스", "MiniMax H3", "하이루오", "이거 상업적으로 써도 되나",
|
|
7
|
+
"무료라던데", "내 그래픽카드로 되나", "오픈소스 영상 모델" 이야기가 나올 때 쓴다.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 미니맥스 H3 — 받기 전에 볼 것 세 가지
|
|
11
|
+
|
|
12
|
+
> 이 파일은 **리본랩스(REBORN LABS)** 의 무료 설치기가 넣은 것입니다.
|
|
13
|
+
> 필요 없으시면 이 폴더를 지우세요. 지워도 `minimax-h3` 스킬은 그대로 동작합니다.
|
|
14
|
+
|
|
15
|
+
## 방금 깐 것
|
|
16
|
+
|
|
17
|
+
`minimax-h3` — 미니맥스 H3 를 **어느 길로 쓸지 골라 주는** 스킬입니다.
|
|
18
|
+
사실 원장(`h3.json`)에 라이선스·사양·순위를 확인일과 함께 적어 두었습니다.
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
npx reborn-minimax-h3 ways 네 갈래를 전부 본다
|
|
22
|
+
npx reborn-minimax-h3 verify 주소가 아직 응답하는지 본다
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
클로드에게는 그냥 말하면 됩니다 — **"미니맥스 H3 나한테 맞는 길 골라줘"**
|
|
26
|
+
|
|
27
|
+
## ① ★한국은 라이선스 제외 지역입니다
|
|
28
|
+
|
|
29
|
+
이게 제일 중요합니다.
|
|
30
|
+
|
|
31
|
+
`MiniMax H3 Community License` 는 적용 범위를
|
|
32
|
+
**"Worldwide, excluding the Excluded Territories"** 로 적고,
|
|
33
|
+
제외 지역에 **유럽연합 · 영국 · 대한민국 · 미국**을 넣었습니다.
|
|
34
|
+
|
|
35
|
+
즉 「무료·오픈소스니까 받아서 쓰면 된다」가 **한국에서는 그대로 성립하지 않습니다.**
|
|
36
|
+
가중치를 받아 상업적으로 쓰실 계획이면 **받기 전에** 확인하셔야 합니다.
|
|
37
|
+
|
|
38
|
+
대신 MiniMax 가 **직접 운영하는 웹 서비스**로는 써 보실 수 있습니다.
|
|
39
|
+
그건 가중치 라이선스가 아니라 각 서비스의 이용 약관을 따릅니다.
|
|
40
|
+
상업적으로 쓰셔야 하면 MiniMax 에 별도 라이선스를 문의하시는 게 정석입니다.
|
|
41
|
+
|
|
42
|
+
이 스킬은 길을 고를 때 **이 조건을 먼저** 말합니다.
|
|
43
|
+
좋은 소식을 먼저 말하면, 사람은 이미 42.5GB 를 받은 뒤에 조건을 읽게 됩니다.
|
|
44
|
+
|
|
45
|
+
## ② 「VRAM 8GB 로 로컬 구동」은 사실이 아닙니다
|
|
46
|
+
|
|
47
|
+
이 말이 릴스와 정리글에 널리 돕니다. 실측 기준선은 이렇습니다.
|
|
48
|
+
|
|
49
|
+
| | 실제 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| 내려받을 용량 | **42.5GB** (체크포인트 + 텍스트 인코더 + VAE 2종) |
|
|
52
|
+
| VRAM | **12GB** — 동적 오프로딩을 켠 경우 |
|
|
53
|
+
| 시스템 RAM | **약 64GB** |
|
|
54
|
+
| 대가 | 오프로딩을 쓰면 렌더가 느려집니다 |
|
|
55
|
+
| 전정밀도(bf16) 전체 | 약 **123.6GB** |
|
|
56
|
+
|
|
57
|
+
8GB 를 믿고 시작하면 **42.5GB 를 다 받은 뒤에** 못 돌린다는 걸 알게 됩니다.
|
|
58
|
+
받기 전에 이 표를 보세요.
|
|
59
|
+
|
|
60
|
+
## ③ 「구글을 이겼다」는 보드마다 다릅니다
|
|
61
|
+
|
|
62
|
+
Artificial Analysis 아레나 기준(확인일 2026-08-26):
|
|
63
|
+
|
|
64
|
+
| 보드 | H3 |
|
|
65
|
+
|---|---|
|
|
66
|
+
| 영상 편집 (오디오 포함) | **1위** — Elo 1,130 (2위 Gemini Omni Flash 1,122) |
|
|
67
|
+
| 텍스트→영상 (오디오 포함) | **2위** — Elo 1,238 (1위 Gemini Omni Flash 1,241) |
|
|
68
|
+
| 이미지→영상 (오디오 포함) | 전체 **2위** · **오픈웨이트 중 1위** — Elo 1,185 |
|
|
69
|
+
|
|
70
|
+
**영상 편집에서는 1위가 맞습니다.** 나머지는 초박빙 2위입니다.
|
|
71
|
+
어느 보드인지 밝히지 않고 「이겼다」고 하면 그건 과장입니다.
|
|
72
|
+
Elo 는 표본이 쌓이면서 움직이니 **확인일을 같이** 보세요.
|
|
73
|
+
|
|
74
|
+
## 그래서 뭘로 시작하나
|
|
75
|
+
|
|
76
|
+
| 하려는 일 | 길 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| 일단 뭐가 나오는지 보고 싶다 | **MiniMax Hub** — 브라우저에서 바로 |
|
|
79
|
+
| 만든 걸 콘텐츠에 바로 쓰겠다 | **Hailuo AI** — 약관 확인 후 |
|
|
80
|
+
| 자동화 파이프라인에 붙이겠다 | **fal.ai 호스팅 API** |
|
|
81
|
+
| 내 GPU 로 직접 돌리겠다 | **가중치** — ★한국이면 라이선스부터 |
|
|
82
|
+
|
|
83
|
+
`npx reborn-minimax-h3 ways` 에 네 갈래가 조건과 함께 전부 있습니다.
|
|
84
|
+
|
|
85
|
+
## 길을 고르고 나면
|
|
86
|
+
|
|
87
|
+
고르는 건 한 번이면 끝납니다. 그다음에 남는 질문은 대개 이것입니다 —
|
|
88
|
+
**"그래서 이걸 매번 누가 돌리지."** 모델이 좋아도 사람이 매번 열어서 눌러야 하면
|
|
89
|
+
일이 준 게 아니라 일이 하나 늘어난 것입니다.
|
|
90
|
+
|
|
91
|
+
그 자리를 메우는 게 **스킬**입니다. 클로드가 절차를 기억하고 대신 밟습니다.
|
|
92
|
+
리본랩스가 골라 담은 스킬 48종이 있습니다 —
|
|
93
|
+
<https://rebornlabs.kr/skillpack?utm_source=installer&utm_medium=guide&utm_campaign=minimax>
|
|
94
|
+
목록과 직접 까는 명령까지 그 페이지에 그대로 적어 두었습니다. 안 사셔도 됩니다.
|