akari-video 0.1.96 → 0.1.97

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akari-video",
3
- "version": "0.1.96",
3
+ "version": "0.1.97",
4
4
  "description": "AKARI Video launcher CLI — start an AI-edited video project from any directory: scaffold, connection check, then hand over to Claude Code (or opencode). AKARI Video を opencode や Claude Code で、どのディレクトリからでも始めるための `akari` ランチャー CLI。接続確認(doctor)→ 未セットアップならプロジェクト雛形を作成 → AI エージェントを起動する。外部 npm 依存ゼロ(Node.js 組み込みモジュールのみ)。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akari-video",
3
- "version": "0.1.96",
3
+ "version": "0.1.97",
4
4
  "description": "AKARI Video launcher CLI — start an AI-edited video project from any directory: scaffold, connection check, then hand over to Claude Code (or opencode). AKARI Video を opencode や Claude Code で、どのディレクトリからでも始めるための `akari` ランチャー CLI。接続確認(doctor)→ 未セットアップならプロジェクト雛形を作成 → AI エージェントを起動する。外部 npm 依存ゼロ(Node.js 組み込みモジュールのみ)。 [akari-video npm vendor: bin/akari.mjs is reference-only. These CLI entrypoints are not included in the akari-video npm package. Use `akari doctor --json` and run the path reported in `render_cut.path`. Full installations provide it in a monorepo checkout, ~/.akari/app, /Applications/AKARI Video.app/Contents/Resources/packages, or %LOCALAPPDATA%\\Programs\\@akari-videoshell\\resources\\packages.]",
5
5
  "type": "module",
6
6
  "files": [
@@ -931,11 +931,23 @@
931
931
  "1024x1024",
932
932
  "3840x2160"
933
933
  ],
934
+ "akari_sizes": {
935
+ "16:9": "1088x608",
936
+ "9:16": "576x1024",
937
+ "1:1": "1024x1024",
938
+ "4:3": "1024x768",
939
+ "3:4": "768x1024",
940
+ "4:5": "1024x1280",
941
+ "3:2": "1536x1024",
942
+ "21:9": "2016x864"
943
+ },
944
+ "akari_sizes_note": "16:9 は Flare 実測。ほかのプリセットは fal の GPT Image 2 資料の公表値、明示寸法は fal-still.mjs の指定値(https://fal.ai/learn/tools/how-to-use-gpt-image-2)。",
934
945
  "duration": null,
935
946
  "audio_out": false
936
947
  },
937
948
  "price": {
938
949
  "unit": "usd_per_image",
950
+ "default_quality": "high",
939
951
  "by_quality_1024": {
940
952
  "low": 0.006,
941
953
  "medium": 0.0133,
@@ -986,11 +998,23 @@
986
998
  "1024x1024",
987
999
  "3840x2160"
988
1000
  ],
1001
+ "akari_sizes": {
1002
+ "16:9": "1088x608",
1003
+ "9:16": "576x1024",
1004
+ "1:1": "1024x1024",
1005
+ "4:3": "1024x768",
1006
+ "3:4": "768x1024",
1007
+ "4:5": "1024x1280",
1008
+ "3:2": "1536x1024",
1009
+ "21:9": "2016x864"
1010
+ },
1011
+ "akari_sizes_note": "16:9 は同じ API 形状の Flare 実測値。ほかのプリセットは fal の GPT Image 2 資料の公表値、明示寸法は fal-still.mjs の指定値(https://fal.ai/learn/tools/how-to-use-gpt-image-2)。",
989
1012
  "duration": null,
990
1013
  "audio_out": false
991
1014
  },
992
1015
  "price": {
993
1016
  "unit": "usd_per_image",
1017
+ "default_quality": "high",
994
1018
  "by_quality_1024": {
995
1019
  "low": 0.006,
996
1020
  "medium": 0.0133,
@@ -36,8 +36,23 @@
36
36
  "via": { "enum": ["subscription", "api", "local"] },
37
37
  "provider": { "type": "string" },
38
38
  "inputs": { "type": "object" },
39
- "outputs": { "type": "object" },
40
- "price": { "type": ["object", "null"] },
39
+ "outputs": {
40
+ "type": "object",
41
+ "properties": {
42
+ "akari_sizes": {
43
+ "type": "object",
44
+ "propertyNames": { "pattern": "^[0-9]+:[0-9]+$" },
45
+ "additionalProperties": { "type": "string", "pattern": "^[1-9][0-9]*x[1-9][0-9]*$" }
46
+ },
47
+ "akari_sizes_note": { "type": "string" }
48
+ }
49
+ },
50
+ "price": {
51
+ "type": ["object", "null"],
52
+ "properties": { "default_quality": { "enum": ["low", "medium", "high"] } },
53
+ "if": { "required": ["by_quality_1024"] },
54
+ "then": { "required": ["default_quality"] }
55
+ },
41
56
  "speed_s": { "type": ["number", "null"], "minimum": 0 },
42
57
  "as_of": { "type": ["string", "null"] },
43
58
  "price_as_of": { "type": "string" },
@@ -0,0 +1,21 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFile } from 'node:fs/promises';
4
+ import Ajv2020 from 'ajv/dist/2020.js';
5
+
6
+ const read = async name => JSON.parse(await readFile(new URL(`../${name}`, import.meta.url), 'utf8'));
7
+
8
+ test('品質の既定値と AKARI の寸法を schema が検査する', async () => {
9
+ const [schema, catalog] = await Promise.all([read('ai-models.schema.json'), read('ai-models.json')]);
10
+ const validate = new Ajv2020({ allErrors: true }).compile(schema);
11
+ assert.equal(validate(catalog), true, JSON.stringify(validate.errors));
12
+ const change = mutate => {
13
+ const copy = structuredClone(catalog);
14
+ mutate(copy.models.find(row => row.id === 'fal:gpt-image-2.5-flare'));
15
+ assert.equal(validate(copy), false);
16
+ };
17
+ change(row => { delete row.price.default_quality; });
18
+ change(row => { row.price.default_quality = 'auto'; });
19
+ change(row => { row.outputs.akari_sizes['16:9'] = '1088×608'; });
20
+ change(row => { row.outputs.akari_sizes['16:9'] = '0x608'; });
21
+ });