opencode-antigravity-img 0.1.1 → 0.2.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 +23 -7
- package/package.json +1 -1
- package/src/api.ts +26 -1
- package/src/index.ts +16 -3
- package/src/types.ts +15 -1
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ opencode
|
|
|
31
31
|
# Use the authenticate command from antigravity-auth
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
This creates
|
|
34
|
+
This creates `antigravity-accounts.json` in your opencode config directory.
|
|
35
35
|
|
|
36
36
|
## Tools
|
|
37
37
|
|
|
@@ -41,12 +41,14 @@ Generate an image from a text prompt.
|
|
|
41
41
|
|
|
42
42
|
**Arguments:**
|
|
43
43
|
- `prompt` (required): Text description of the image to generate
|
|
44
|
-
- `filename` (optional): Output filename (default: `generated_<timestamp>.
|
|
44
|
+
- `filename` (optional): Output filename (default: `generated_<timestamp>.jpg`)
|
|
45
45
|
- `output_dir` (optional): Output directory (default: current working directory)
|
|
46
|
+
- `aspect_ratio` (optional): Image aspect ratio. Supported values: `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9` (default: `1:1`)
|
|
47
|
+
- `image_size` (optional): Image resolution. Supported values: `1K`, `2K`, `4K` (default: `1K`)
|
|
46
48
|
|
|
47
49
|
**Example:**
|
|
48
50
|
```
|
|
49
|
-
Generate
|
|
51
|
+
Generate a 16:9 landscape image of a sunset over mountains with a lake in the foreground
|
|
50
52
|
```
|
|
51
53
|
|
|
52
54
|
**Output:**
|
|
@@ -66,13 +68,27 @@ Check the remaining quota for the Gemini 3 Pro Image model.
|
|
|
66
68
|
## Image Details
|
|
67
69
|
|
|
68
70
|
- **Model**: Gemini 3 Pro Image
|
|
69
|
-
- **
|
|
70
|
-
-
|
|
71
|
+
- **Resolutions**:
|
|
72
|
+
- `1K`: 1024x1024 (default)
|
|
73
|
+
- `2K`: 2048x2048
|
|
74
|
+
- `4K`: 4096x4096
|
|
75
|
+
- **Aspect ratios**: `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9`
|
|
76
|
+
- **Format**: JPEG (always, regardless of filename extension)
|
|
71
77
|
- **Generation time**: 10-30 seconds
|
|
72
78
|
|
|
79
|
+
## Unsupported Parameters
|
|
80
|
+
|
|
81
|
+
The following parameters are documented in Google's API but are **not supported** by the Gemini 3 Pro Image model (they are Imagen-specific):
|
|
82
|
+
|
|
83
|
+
- `personGeneration` - Control generation of people in images
|
|
84
|
+
- `outputMimeType` - Output format selection (always returns JPEG)
|
|
85
|
+
- `compressionQuality` - JPEG compression control
|
|
86
|
+
|
|
87
|
+
These parameters may work with Imagen models but have no effect with Gemini 3 Pro Image.
|
|
88
|
+
|
|
73
89
|
## Quota
|
|
74
90
|
|
|
75
|
-
Image generation uses a separate quota from text models. The quota
|
|
91
|
+
Image generation uses a separate quota from text models. The quota resets every 5 hours. Use the `image_quota` tool to check your remaining quota.
|
|
76
92
|
|
|
77
93
|
## Troubleshooting
|
|
78
94
|
|
|
@@ -81,7 +97,7 @@ Image generation uses a separate quota from text models. The quota typically res
|
|
|
81
97
|
Make sure you've:
|
|
82
98
|
1. Installed `opencode-antigravity-auth`
|
|
83
99
|
2. Authenticated with your Google account
|
|
84
|
-
3. The credentials file
|
|
100
|
+
3. The credentials file `antigravity-accounts.json` exists in your opencode config directory
|
|
85
101
|
|
|
86
102
|
### "Rate limited" or generation fails
|
|
87
103
|
|
package/package.json
CHANGED
package/src/api.ts
CHANGED
|
@@ -15,6 +15,7 @@ import type {
|
|
|
15
15
|
CloudCodeQuotaResponse,
|
|
16
16
|
GenerateContentResponse,
|
|
17
17
|
ImageGenerationResult,
|
|
18
|
+
ImageGenerationOptions,
|
|
18
19
|
QuotaInfo,
|
|
19
20
|
} from "./types";
|
|
20
21
|
|
|
@@ -149,12 +150,34 @@ export async function getImageModelQuota(account: Account): Promise<QuotaInfo |
|
|
|
149
150
|
}
|
|
150
151
|
}
|
|
151
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Build imageConfig from options
|
|
155
|
+
*/
|
|
156
|
+
function buildImageConfig(options?: ImageGenerationOptions): ImageGenerationOptions | undefined {
|
|
157
|
+
if (!options) return undefined;
|
|
158
|
+
|
|
159
|
+
const { aspectRatio, imageSize } = options;
|
|
160
|
+
|
|
161
|
+
// Only include if at least one option is set
|
|
162
|
+
if (!aspectRatio && !imageSize) {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const imageConfig: ImageGenerationOptions = {};
|
|
167
|
+
|
|
168
|
+
if (aspectRatio) imageConfig.aspectRatio = aspectRatio;
|
|
169
|
+
if (imageSize) imageConfig.imageSize = imageSize;
|
|
170
|
+
|
|
171
|
+
return imageConfig;
|
|
172
|
+
}
|
|
173
|
+
|
|
152
174
|
/**
|
|
153
175
|
* Generate an image using the Gemini 3 Pro Image model
|
|
154
176
|
*/
|
|
155
177
|
export async function generateImage(
|
|
156
178
|
account: Account,
|
|
157
|
-
prompt: string
|
|
179
|
+
prompt: string,
|
|
180
|
+
options?: ImageGenerationOptions
|
|
158
181
|
): Promise<ImageGenerationResult> {
|
|
159
182
|
try {
|
|
160
183
|
// Get access token
|
|
@@ -172,6 +195,7 @@ export async function generateImage(
|
|
|
172
195
|
}
|
|
173
196
|
|
|
174
197
|
// Build request
|
|
198
|
+
const imageConfig = buildImageConfig(options);
|
|
175
199
|
const requestBody = {
|
|
176
200
|
project: projectId,
|
|
177
201
|
requestId: `req_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
@@ -183,6 +207,7 @@ export async function generateImage(
|
|
|
183
207
|
session_id: `sess_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
184
208
|
generationConfig: {
|
|
185
209
|
responseModalities: ["TEXT", "IMAGE"],
|
|
210
|
+
...(imageConfig && { imageConfig }),
|
|
186
211
|
},
|
|
187
212
|
},
|
|
188
213
|
};
|
package/src/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as fs from "fs/promises";
|
|
|
3
3
|
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
|
|
4
4
|
import { join, dirname } from "path";
|
|
5
5
|
import { CONFIG_PATHS, COMMAND_DIR, COMMAND_FILE, COMMAND_CONTENT, IMAGE_MODEL } from "./constants";
|
|
6
|
-
import type { AccountsConfig, Account } from "./types";
|
|
6
|
+
import type { AccountsConfig, Account, ImageGenerationOptions, AspectRatio, ImageSize } from "./types";
|
|
7
7
|
import { generateImage, getImageModelQuota } from "./api";
|
|
8
8
|
|
|
9
9
|
// Create command file for opencode discovery
|
|
@@ -83,9 +83,17 @@ export const plugin: Plugin = async (ctx) => {
|
|
|
83
83
|
.string()
|
|
84
84
|
.optional()
|
|
85
85
|
.describe("Output directory (default: current working directory)"),
|
|
86
|
+
aspect_ratio: tool.schema
|
|
87
|
+
.string()
|
|
88
|
+
.optional()
|
|
89
|
+
.describe("Aspect ratio: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 (default: 1:1)"),
|
|
90
|
+
image_size: tool.schema
|
|
91
|
+
.string()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe("Image resolution: 1K, 2K, 4K (default: 1K)"),
|
|
86
94
|
},
|
|
87
95
|
async execute(args, context) {
|
|
88
|
-
const { prompt, filename, output_dir } = args;
|
|
96
|
+
const { prompt, filename, output_dir, aspect_ratio, image_size } = args;
|
|
89
97
|
|
|
90
98
|
if (!prompt?.trim()) {
|
|
91
99
|
return "Error: Please provide a prompt describing the image to generate.";
|
|
@@ -105,8 +113,13 @@ export const plugin: Plugin = async (ctx) => {
|
|
|
105
113
|
|
|
106
114
|
context.metadata({ title: "Generating image..." });
|
|
107
115
|
|
|
116
|
+
// Build generation options
|
|
117
|
+
const options: ImageGenerationOptions = {};
|
|
118
|
+
if (aspect_ratio) options.aspectRatio = aspect_ratio as AspectRatio;
|
|
119
|
+
if (image_size) options.imageSize = image_size as ImageSize;
|
|
120
|
+
|
|
108
121
|
// Generate image
|
|
109
|
-
const result = await generateImage(account, prompt);
|
|
122
|
+
const result = await generateImage(account, prompt, Object.keys(options).length > 0 ? options : undefined);
|
|
110
123
|
|
|
111
124
|
if (!result.success || !result.imageData) {
|
|
112
125
|
return `Error generating image: ${result.error || "Unknown error"}`;
|
package/src/types.ts
CHANGED
|
@@ -37,7 +37,20 @@ export interface ModelInfo {
|
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
// Image generation
|
|
40
|
+
// Image generation options
|
|
41
|
+
export type AspectRatio = "1:1" | "2:3" | "3:2" | "3:4" | "4:3" | "4:5" | "5:4" | "9:16" | "16:9" | "21:9";
|
|
42
|
+
export type ImageSize = "1K" | "2K" | "4K";
|
|
43
|
+
|
|
44
|
+
export interface ImageConfig {
|
|
45
|
+
aspectRatio?: AspectRatio;
|
|
46
|
+
imageSize?: ImageSize;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ImageGenerationOptions {
|
|
50
|
+
aspectRatio?: AspectRatio;
|
|
51
|
+
imageSize?: ImageSize;
|
|
52
|
+
}
|
|
53
|
+
|
|
41
54
|
export interface GenerateContentRequest {
|
|
42
55
|
project: string;
|
|
43
56
|
requestId: string;
|
|
@@ -52,6 +65,7 @@ export interface GenerateContentRequest {
|
|
|
52
65
|
session_id: string;
|
|
53
66
|
generationConfig: {
|
|
54
67
|
responseModalities: string[];
|
|
68
|
+
imageConfig?: ImageConfig;
|
|
55
69
|
};
|
|
56
70
|
};
|
|
57
71
|
}
|