pi-media-models 0.1.8 → 0.1.9
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 +228 -176
- package/index.ts +11 -11
- package/package.json +48 -46
- package/skills/pi-media/SKILL.md +111 -108
- package/src/adapters/atlas.ts +171 -171
- package/src/adapters/base.ts +114 -111
- package/src/adapters/custom.ts +154 -154
- package/src/adapters/dashscope-tts.ts +182 -0
- package/src/adapters/dashscope.ts +192 -151
- package/src/adapters/fal.ts +135 -135
- package/src/adapters/google.ts +338 -338
- package/src/adapters/openai.ts +129 -129
- package/src/adapters/openrouter.ts +129 -129
- package/src/adapters/xai.ts +134 -134
- package/src/artifacts.ts +130 -130
- package/src/config.ts +131 -131
- package/src/errors.ts +61 -61
- package/src/http.ts +131 -131
- package/src/input.ts +104 -104
- package/src/media-job.ts +89 -89
- package/src/router.ts +211 -200
- package/src/tools.ts +212 -212
- package/src/types.ts +159 -158
package/README.md
CHANGED
|
@@ -1,176 +1,228 @@
|
|
|
1
|
-
# pi-media-models
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/pi-media-models)
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
|
|
6
|
-
**Provider-neutral multimodal generation extension for Pi Coding Agent.**
|
|
7
|
-
|
|
8
|
-
This extension seamlessly bridges Pi's reasoning capabilities with top-tier AI media generation platforms. It abstracts away complex multi-part uploads, background task polling, CDN hosting, and API differences, exposing exactly **6 unified tools** for the agent.
|
|
9
|
-
|
|
10
|
-
## ✨ Features
|
|
11
|
-
|
|
12
|
-
- **Live Model Discovery**: Queries configured provider catalogs, performs lightweight access probes where supported, and marks the newest usable model as the default.
|
|
13
|
-
- **Unified Interface**: One request format (`provider`, optional `model`, `prompt`, `referenceImages`, etc.) maps automatically to the correct capability across providers. Omit `model` to use the newest discovered usable model.
|
|
14
|
-
- **Config-First Authentication**: Manage all API keys and credentials directly in a single `media-models.json` configuration file — no cluttered environment variables needed.
|
|
15
|
-
- **Auto-Download**: Output media (images, videos, audio) is automatically downloaded and saved to a local directory (`~/.pi/agent/media/outputs/`) using atomic `.part` renames. LLM context remains pristine and only receives local file paths.
|
|
16
|
-
- **Smart Input Resolution**: Pass local paths (`C:/...` or `/path/...`), file URIs (`file://`), standard URLs (`http(s)://`), or base64 (`data:...`). The router transparently handles multipart uploads, base64 encoding, or CDN pre-uploading (e.g., for `fal.ai`).
|
|
17
|
-
- **Resilient Polling**: Advanced `MediaJob` processing handles asynchronous Long-Running Operations (LROs), 429 rate limits (respecting `Retry-After`), and timeouts. Supports remote job cancellation where supported by the provider.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- **
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
You can
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
|
143
|
-
|
|
144
|
-
| **
|
|
145
|
-
| **
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
6
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
1
|
+
# pi-media-models
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/pi-media-models)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
**Provider-neutral multimodal generation extension for Pi Coding Agent.**
|
|
7
|
+
|
|
8
|
+
This extension seamlessly bridges Pi's reasoning capabilities with top-tier AI media generation platforms. It abstracts away complex multi-part uploads, background task polling, CDN hosting, and API differences, exposing exactly **6 unified tools** for the agent.
|
|
9
|
+
|
|
10
|
+
## ✨ Features
|
|
11
|
+
|
|
12
|
+
- **Live Model Discovery**: Queries configured provider catalogs, performs lightweight access probes where supported, and marks the newest usable model as the default.
|
|
13
|
+
- **Unified Interface**: One request format (`provider`, optional `model`, `prompt`, `referenceImages`, etc.) maps automatically to the correct capability across providers. Omit `model` to use the newest discovered usable model.
|
|
14
|
+
- **Config-First Authentication**: Manage all API keys and credentials directly in a single `media-models.json` configuration file — no cluttered environment variables needed.
|
|
15
|
+
- **Auto-Download**: Output media (images, videos, audio) is automatically downloaded and saved to a local directory (`~/.pi/agent/media/outputs/`) using atomic `.part` renames. LLM context remains pristine and only receives local file paths.
|
|
16
|
+
- **Smart Input Resolution**: Pass local paths (`C:/...` or `/path/...`), file URIs (`file://`), standard URLs (`http(s)://`), or base64 (`data:...`). The router transparently handles multipart uploads, base64 encoding, or CDN pre-uploading (e.g., for `fal.ai`).
|
|
17
|
+
- **Resilient Polling**: Advanced `MediaJob` processing handles asynchronous Long-Running Operations (LROs), 429 rate limits (respecting `Retry-After`), and timeouts. Supports remote job cancellation where supported by the provider.
|
|
18
|
+
- **Native Qwen Audio TTS**: Uses Alibaba's duplex WebSocket protocol for `qwen-audio-3.0-tts-plus` and `qwen-audio-3.0-tts-flash`, including binary audio streaming and instruction/language controls.
|
|
19
|
+
|
|
20
|
+
## 📦 Installation
|
|
21
|
+
|
|
22
|
+
This extension is built for the **Pi Coding Agent**. It bundles both the executable extension logic and the LLM `SKILL.md` prompt context.
|
|
23
|
+
|
|
24
|
+
Install natively inside your Pi environment:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Install via NPM (Recommended)
|
|
28
|
+
pi install npm:pi-media-models
|
|
29
|
+
|
|
30
|
+
# Or install directly from GitHub
|
|
31
|
+
pi install git:github.com/luffysolution-svg/pi-media-models
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Once installed, restart Pi or type `/reload` in your active session.
|
|
35
|
+
|
|
36
|
+
## 🚀 Quick Usage
|
|
37
|
+
|
|
38
|
+
After installation, the extension and its companion skill are active immediately. You can talk to Pi naturally — Pi knows how to query available models and route tasks to the appropriate tool.
|
|
39
|
+
|
|
40
|
+
**Example Prompts:**
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
帮我用 fal.ai 画一张赛博朋克风格的雨夜街景,比例 16:9
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Use xAI to generate a 5-second video of ocean waves with audio
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
使用 Atlas 编辑这张图片,把背景换成雪山:C:/assets/photo.jpg
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
帮我查一下当前已配置好可用的多模态模型有哪些?
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Pi 会自动调取对应工具、完成排队轮询与文件下载,并直接返回本地媒体文件的保存路径。
|
|
59
|
+
|
|
60
|
+
## ⚙️ Configuration
|
|
61
|
+
|
|
62
|
+
All API keys, custom endpoints, and output paths are configured directly in a single JSON file.
|
|
63
|
+
|
|
64
|
+
**Configuration File Location:**
|
|
65
|
+
- **Global (Recommended):** `~/.pi/agent/media-models.json`
|
|
66
|
+
- **Project-Specific:** `<project_root>/.pi/media-models.json`
|
|
67
|
+
|
|
68
|
+
### Example `media-models.json`
|
|
69
|
+
|
|
70
|
+
Create or edit `~/.pi/agent/media-models.json`:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"outputDir": "~/.pi/agent/media/outputs",
|
|
75
|
+
"providerOptions": {
|
|
76
|
+
"fal": {
|
|
77
|
+
"apiKey": "fal-xxxxxxxxxxxxxxxxxxxx"
|
|
78
|
+
},
|
|
79
|
+
"xai": {
|
|
80
|
+
"apiKey": "xai-xxxxxxxxxxxxxxxxxxxx"
|
|
81
|
+
},
|
|
82
|
+
"atlas": {
|
|
83
|
+
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxx"
|
|
84
|
+
},
|
|
85
|
+
"dashscope": {
|
|
86
|
+
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxx"
|
|
87
|
+
},
|
|
88
|
+
"qwencloud": {
|
|
89
|
+
"apiKey": "sk-ws-xxxxxxxxxxxxxxxxxxxx"
|
|
90
|
+
},
|
|
91
|
+
"openai": {
|
|
92
|
+
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxx"
|
|
93
|
+
},
|
|
94
|
+
"gemini": {
|
|
95
|
+
"apiKey": "AIzaxxxxxxxxxxxxxxxxxxxx"
|
|
96
|
+
},
|
|
97
|
+
"openrouter": {
|
|
98
|
+
"apiKey": "sk-or-xxxxxxxxxxxxxxxxxxxx"
|
|
99
|
+
},
|
|
100
|
+
"vertex": {
|
|
101
|
+
"credentialsFile": "/path/to/vertex-service-account.json",
|
|
102
|
+
"location": "us-central1"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> **Note**: You only need to fill in the providers you plan to use. Unused providers can simply be omitted. `dashscope` uses the China endpoint, while `qwencloud` uses the international endpoint and requires its own QwenCloud API key. Do not paste API keys into prompts or `providerOptions`; credential and endpoint overrides are accepted only from `media-models.json`. Vertex reads `project_id` from the service-account JSON when `project` is omitted or still set to a placeholder such as `my-gcp-project`; an explicit real project ID remains supported. Set `location` to `global` to use Vertex's global endpoint for models that support it.
|
|
109
|
+
|
|
110
|
+
Environment-variable fallback is also supported. Use `DASHSCOPE_API_KEY` for China and `QWENCLOUD_API_KEY` for international QwenCloud. For backward compatibility, QwenCloud also checks `DASHSCOPE_API_KEY` when `QWENCLOUD_API_KEY` is absent.
|
|
111
|
+
|
|
112
|
+
### Custom OpenAI-Compatible Providers
|
|
113
|
+
|
|
114
|
+
You can connect any third-party or internal OpenAI-compatible media gateway by declaring it in `customProviders`:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"customProviders": [
|
|
119
|
+
{
|
|
120
|
+
"id": "my-custom-ai",
|
|
121
|
+
"name": "Internal AI Gateway",
|
|
122
|
+
"baseUrl": "https://api.internal.com/v1",
|
|
123
|
+
"apiKeyEnv": "MY_CUSTOM_AI_API_KEY",
|
|
124
|
+
"auth": "bearer",
|
|
125
|
+
"models": [
|
|
126
|
+
{
|
|
127
|
+
"id": "internal-video-pro",
|
|
128
|
+
"vendor": "internal",
|
|
129
|
+
"capabilities": ["video.text_to_video"],
|
|
130
|
+
"endpoints": {
|
|
131
|
+
"video.text_to_video": "/videos/generations"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 🔌 Supported Providers
|
|
141
|
+
|
|
142
|
+
| Provider | Provider ID | Supported Capabilities | Config Option |
|
|
143
|
+
|---|---|---|---|
|
|
144
|
+
| **fal.ai** | `fal` | Images, Video, Audio, TTS, STT (Queue/CDN integration) | `providerOptions.fal.apiKey` |
|
|
145
|
+
| **xAI (Grok Imagine)** | `xai` | Image Gen/Edit, T2V/I2V, Reference-to-Video, Video Extend | `providerOptions.xai.apiKey` |
|
|
146
|
+
| **Atlas API** | `atlas` | Sync/Async Image Gen & Edit, Video LROs | `providerOptions.atlas.apiKey` |
|
|
147
|
+
| **DashScope / 百炼** | `dashscope` | Qwen Image 3, Wan 3 Video, Fun-Music, Qwen Audio TTS/STT | `providerOptions.dashscope.apiKey` |
|
|
148
|
+
| **QwenCloud** | `qwencloud` | Same model families through international HTTP and WebSocket endpoints | `providerOptions.qwencloud.apiKey` |
|
|
149
|
+
| **OpenAI API** | `openai` | Image Gen/Edit (DALL-E), TTS, STT (Whisper) | `providerOptions.openai.apiKey` |
|
|
150
|
+
| **Google Gemini API** | `gemini` | Gemini/Imagen, Veo, Lyria, TTS, STT | `providerOptions.gemini.apiKey` |
|
|
151
|
+
| **Google Vertex AI** | `vertex` | ADC, Imagen/Gemini, Veo, Lyria, TTS, STT | `providerOptions.vertex.credentialsFile` |
|
|
152
|
+
| **OpenRouter** | `openrouter` | Image Generation, Async Video, TTS | `providerOptions.openrouter.apiKey` |
|
|
153
|
+
|
|
154
|
+
## 🛠️ Exposed Tools
|
|
155
|
+
|
|
156
|
+
The extension registers exactly 6 unified tools for the reasoning agent:
|
|
157
|
+
|
|
158
|
+
1. `media_models`: Discovers credential-visible models, probes access where supported, reports availability, and marks the newest usable model as the default.
|
|
159
|
+
2. `image_generate`: Generate images from text, image, or multiple reference inputs. `model` is optional; omission selects the newest usable discovered model.
|
|
160
|
+
3. `image_edit`: Edit existing images (supports masks and multiple references).
|
|
161
|
+
4. `video_generate`: Generates, edits, or extends videos. Automatically maps inputs (`referenceImages`, `inputVideo`, `duration`, `generateAudio`, etc.) to the provider's exact capability.
|
|
162
|
+
5. `audio_generate`: Generate music or raw audio (separate from TTS).
|
|
163
|
+
6. `speech_generate`: Handle TTS (Text-to-Speech) and STT (Speech-to-Text).
|
|
164
|
+
|
|
165
|
+
Live catalog discovery is implemented for Google Gemini, Vertex AI Model Garden, OpenAI, xAI, Atlas, and OpenRouter. Providers without a reliable catalog API use their declared fallback candidates; those entries are labeled `source=built-in` and `availability=unknown` rather than being presented as verified.
|
|
166
|
+
|
|
167
|
+
### QwenCloud and DashScope examples
|
|
168
|
+
|
|
169
|
+
Use the flagship image model. Synchronous Qwen Image requests default to a three-minute request timeout; override it with `requestTimeoutMs` when needed:
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
image_generate({
|
|
173
|
+
provider: "qwencloud",
|
|
174
|
+
model: "qwen-image-3.0-pro",
|
|
175
|
+
prompt: "cinematic moonlit mountains",
|
|
176
|
+
resolution: "1664*928",
|
|
177
|
+
providerOptions: { requestTimeoutMs: 300000 }
|
|
178
|
+
})
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Wan video resolutions are normalized case-insensitively, so both `"1080p"` and Alibaba's documented `"1080P"` work:
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
video_generate({
|
|
185
|
+
provider: "qwencloud",
|
|
186
|
+
model: "wan3.0-video",
|
|
187
|
+
prompt: "slow cinematic camera move",
|
|
188
|
+
resolution: "1080p",
|
|
189
|
+
duration: 5,
|
|
190
|
+
generateAudio: true
|
|
191
|
+
})
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Qwen Audio 3 TTS uses the provider's WebSocket API automatically. `plus` prioritizes output quality; `flash` prioritizes latency. If `voice` is omitted, the adapter uses `longanhuan_v3.6`:
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
speech_generate({
|
|
198
|
+
provider: "qwencloud",
|
|
199
|
+
model: "qwen-audio-3.0-tts-plus",
|
|
200
|
+
operation: "tts",
|
|
201
|
+
text: "床前明月光,疑是地上霜。",
|
|
202
|
+
language: "zh",
|
|
203
|
+
responseFormat: "mp3",
|
|
204
|
+
providerOptions: {
|
|
205
|
+
instruction: "Read calmly with a classical poetic tone."
|
|
206
|
+
}
|
|
207
|
+
})
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Avoid forcing `providerOptions.async: true` for Qwen Image unless the account supports asynchronous calls. Paid generation submissions are not retried automatically after ambiguous POST failures, preventing accidental duplicate charges; retry manually after confirming no job was created.
|
|
211
|
+
|
|
212
|
+
## 🔒 Security & Privacy
|
|
213
|
+
|
|
214
|
+
- **No Key Logging**: API keys and Bearer tokens are redacted (`[REDACTED]`) from all error logs and HTTP outputs before being returned to the LLM.
|
|
215
|
+
- **Local Downloads**: Media assets are fetched directly by your local client into your configured `outputDir` without third-party proxies.
|
|
216
|
+
- **Git Ignored**: `media-models.json` is automatically ignored from git repositories to prevent accidental credential commits.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 🔄 Updating
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
pi update npm:pi-media-models
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## 📄 License
|
|
227
|
+
|
|
228
|
+
MIT
|
package/index.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { ExtensionAPI } from '@earendil-works/pi-coding-agent'
|
|
2
|
-
import { registerMediaTools } from './src/tools.js'
|
|
3
|
-
|
|
4
|
-
export { CapabilityRouter } from './src/router.js'
|
|
5
|
-
export { MediaJob } from './src/media-job.js'
|
|
6
|
-
export { MediaError, redactSecrets } from './src/errors.js'
|
|
7
|
-
export * from './src/types.js'
|
|
8
|
-
|
|
9
|
-
export default function piMediaExtension(pi: ExtensionAPI): void {
|
|
10
|
-
registerMediaTools(pi)
|
|
11
|
-
}
|
|
1
|
+
import type { ExtensionAPI } from '@earendil-works/pi-coding-agent'
|
|
2
|
+
import { registerMediaTools } from './src/tools.js'
|
|
3
|
+
|
|
4
|
+
export { CapabilityRouter } from './src/router.js'
|
|
5
|
+
export { MediaJob } from './src/media-job.js'
|
|
6
|
+
export { MediaError, redactSecrets } from './src/errors.js'
|
|
7
|
+
export * from './src/types.js'
|
|
8
|
+
|
|
9
|
+
export default function piMediaExtension(pi: ExtensionAPI): void {
|
|
10
|
+
registerMediaTools(pi)
|
|
11
|
+
}
|
package/package.json
CHANGED
|
@@ -1,46 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "pi-media-models",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"type": "module",
|
|
5
|
-
"description": "Provider-neutral multimodal generation tools for Pi Coding Agent",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"pi-package"
|
|
8
|
-
],
|
|
9
|
-
"pi": {
|
|
10
|
-
"extensions": [
|
|
11
|
-
"./index.ts"
|
|
12
|
-
],
|
|
13
|
-
"skills": [
|
|
14
|
-
"./skills"
|
|
15
|
-
]
|
|
16
|
-
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"typecheck": "tsc --noEmit",
|
|
19
|
-
"test": "cross-env PI_MEDIA_TEST_MODE=1 tsx --test test/**/*.test.ts",
|
|
20
|
-
"check": "npm run typecheck && npm test",
|
|
21
|
-
"smoke:live": "tsx scripts/live-smoke.ts"
|
|
22
|
-
},
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"google-auth-library": "^10.5.0",
|
|
25
|
-
"typebox": "^1.0.62"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"@
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "pi-media-models",
|
|
3
|
+
"version": "0.1.9",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Provider-neutral multimodal generation tools for Pi Coding Agent",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"pi-package"
|
|
8
|
+
],
|
|
9
|
+
"pi": {
|
|
10
|
+
"extensions": [
|
|
11
|
+
"./index.ts"
|
|
12
|
+
],
|
|
13
|
+
"skills": [
|
|
14
|
+
"./skills"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"test": "cross-env PI_MEDIA_TEST_MODE=1 tsx --test test/**/*.test.ts",
|
|
20
|
+
"check": "npm run typecheck && npm test",
|
|
21
|
+
"smoke:live": "tsx scripts/live-smoke.ts"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"google-auth-library": "^10.5.0",
|
|
25
|
+
"typebox": "^1.0.62",
|
|
26
|
+
"ws": "^8.21.3"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@earendil-works/pi-coding-agent": "*"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@earendil-works/pi-coding-agent": "0.84.4",
|
|
33
|
+
"@types/node": "^24.10.0",
|
|
34
|
+
"@types/ws": "^8.18.1",
|
|
35
|
+
"cross-env": "^10.1.0",
|
|
36
|
+
"tsx": "^4.21.0",
|
|
37
|
+
"typescript": "^5.9.3"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=20"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"src",
|
|
44
|
+
"skills",
|
|
45
|
+
"index.ts",
|
|
46
|
+
"README.md"
|
|
47
|
+
]
|
|
48
|
+
}
|