opencode-pollinations-plugin 6.1.0-beta.9 → 6.2.1
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.de.md +130 -0
- package/README.es.md +130 -0
- package/README.fr.md +130 -0
- package/README.it.md +130 -0
- package/README.md +87 -73
- package/dist/index.js +52 -161
- package/dist/locales/de.json +374 -0
- package/dist/locales/en.json +373 -0
- package/dist/locales/es.json +374 -0
- package/dist/locales/fr.json +373 -0
- package/dist/locales/index.d.ts +1 -0
- package/dist/locales/index.js +37 -0
- package/dist/locales/it.json +374 -0
- package/dist/server/commands.d.ts +6 -0
- package/dist/server/commands.js +394 -125
- package/dist/server/config.d.ts +34 -23
- package/dist/server/config.js +200 -108
- package/dist/server/connect-response.d.ts +2 -0
- package/dist/server/connect-response.js +59 -0
- package/dist/server/generate-config.d.ts +3 -30
- package/dist/server/generate-config.js +164 -106
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +124 -149
- package/dist/server/logger.d.ts +8 -0
- package/dist/server/logger.js +38 -0
- package/dist/server/models/cache.d.ts +35 -0
- package/dist/server/models/cache.js +160 -0
- package/dist/server/models/fetcher.d.ts +18 -0
- package/dist/server/models/fetcher.js +194 -0
- package/dist/server/models/index.d.ts +6 -0
- package/dist/server/models/index.js +5 -0
- package/dist/server/models/manual.d.ts +15 -0
- package/dist/server/models/manual.js +92 -0
- package/dist/server/models/types.d.ts +55 -0
- package/dist/server/models/types.js +7 -0
- package/dist/server/models/worker.d.ts +22 -0
- package/dist/server/models/worker.js +174 -0
- package/dist/server/pollinations-api.d.ts +11 -0
- package/dist/server/pollinations-api.js +21 -8
- package/dist/server/proxy.js +222 -307
- package/dist/server/quota.d.ts +2 -0
- package/dist/server/quota.js +89 -86
- package/dist/server/scripts/pollinations_pricing.d.ts +8 -0
- package/dist/server/scripts/pollinations_pricing.js +246 -0
- package/dist/server/scripts/test_cost_endpoints.d.ts +1 -0
- package/dist/server/scripts/test_cost_endpoints.js +61 -0
- package/dist/server/scripts/test_dynamic_pricing.d.ts +1 -0
- package/dist/server/scripts/test_dynamic_pricing.js +39 -0
- package/dist/server/scripts/test_freetier_audit.d.ts +11 -0
- package/dist/server/scripts/test_freetier_audit.js +215 -0
- package/dist/server/scripts/test_parallel_cost.d.ts +1 -0
- package/dist/server/scripts/test_parallel_cost.js +104 -0
- package/dist/server/toast.d.ts +7 -1
- package/dist/server/toast.js +43 -10
- package/dist/tools/design/gen_diagram.d.ts +2 -0
- package/dist/tools/design/gen_diagram.js +94 -0
- package/dist/tools/design/gen_palette.d.ts +2 -0
- package/dist/tools/design/gen_palette.js +182 -0
- package/dist/tools/design/gen_qrcode.d.ts +2 -0
- package/dist/tools/design/gen_qrcode.js +50 -0
- package/dist/tools/ffmpeg.d.ts +24 -0
- package/dist/tools/ffmpeg.js +54 -0
- package/dist/tools/index.d.ts +25 -0
- package/dist/tools/index.js +86 -0
- package/dist/tools/pollinations/beta_discovery.d.ts +9 -0
- package/dist/tools/pollinations/beta_discovery.js +201 -0
- package/dist/tools/pollinations/cost-guard.d.ts +38 -0
- package/dist/tools/pollinations/cost-guard.js +136 -0
- package/dist/tools/pollinations/deepsearch.d.ts +7 -0
- package/dist/tools/pollinations/deepsearch.js +80 -0
- package/dist/tools/pollinations/gen_audio.d.ts +18 -0
- package/dist/tools/pollinations/gen_audio.js +220 -0
- package/dist/tools/pollinations/gen_image.d.ts +11 -0
- package/dist/tools/pollinations/gen_image.js +211 -0
- package/dist/tools/pollinations/gen_music.d.ts +14 -0
- package/dist/tools/pollinations/gen_music.js +157 -0
- package/dist/tools/pollinations/gen_video.d.ts +16 -0
- package/dist/tools/pollinations/gen_video.js +249 -0
- package/dist/tools/pollinations/polli_config.d.ts +2 -0
- package/dist/tools/pollinations/polli_config.js +95 -0
- package/dist/tools/pollinations/polli_gen_confirm.d.ts +2 -0
- package/dist/tools/pollinations/polli_gen_confirm.js +48 -0
- package/dist/tools/pollinations/polli_status.d.ts +2 -0
- package/dist/tools/pollinations/polli_status.js +31 -0
- package/dist/tools/pollinations/polli_web_search.d.ts +15 -0
- package/dist/tools/pollinations/polli_web_search.js +126 -0
- package/dist/tools/pollinations/search_crawl_scrape.d.ts +7 -0
- package/dist/tools/pollinations/search_crawl_scrape.js +85 -0
- package/dist/tools/pollinations/shared.d.ts +181 -0
- package/dist/tools/pollinations/shared.js +758 -0
- package/dist/tools/pollinations/test_estimators.d.ts +1 -0
- package/dist/tools/pollinations/test_estimators.js +22 -0
- package/dist/tools/pollinations/transcribe_audio.d.ts +13 -0
- package/dist/tools/pollinations/transcribe_audio.js +171 -0
- package/dist/tools/power/extract_audio.d.ts +2 -0
- package/dist/tools/power/extract_audio.js +179 -0
- package/dist/tools/power/extract_frames.d.ts +2 -0
- package/dist/tools/power/extract_frames.js +237 -0
- package/dist/tools/power/file_to_url.d.ts +2 -0
- package/dist/tools/power/file_to_url.js +217 -0
- package/dist/tools/power/remove_background.d.ts +2 -0
- package/dist/tools/power/remove_background.js +404 -0
- package/dist/tools/power/rmbg_keys.d.ts +2 -0
- package/dist/tools/power/rmbg_keys.js +79 -0
- package/dist/tools/shared.d.ts +30 -0
- package/dist/tools/shared.js +80 -0
- package/package.json +9 -3
- package/dist/server/models-seed.d.ts +0 -18
- package/dist/server/models-seed.js +0 -55
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { polliGenImageTool } from '../../tools/pollinations/gen_image.js';
|
|
2
|
+
import { polliGenVideoTool } from '../../tools/pollinations/gen_video.js';
|
|
3
|
+
import { polliGenAudioTool } from '../../tools/pollinations/gen_audio.js';
|
|
4
|
+
import { polliGenMusicTool } from '../../tools/pollinations/gen_music.js';
|
|
5
|
+
import { polliWebSearchTool } from '../../tools/pollinations/polli_web_search.js';
|
|
6
|
+
import { ModelRegistry } from './index.js';
|
|
7
|
+
import { log } from '../logger.js';
|
|
8
|
+
import { per1pollen, estimateImageCost, estimateVideoCost } from '../../tools/pollinations/shared.js';
|
|
9
|
+
/**
|
|
10
|
+
* ToolRegistryWorker
|
|
11
|
+
* Responsabilité : Patcher dynamiquement la propriété "description" des Tools statiques
|
|
12
|
+
* (ex: polliGenImageTool, polliGenVideoTool) pour y injecter le catalogue temps réel
|
|
13
|
+
* rapatrié par le ModelRegistry.
|
|
14
|
+
*/
|
|
15
|
+
export class ToolRegistryWorker {
|
|
16
|
+
static isRunning = false;
|
|
17
|
+
static interval = null;
|
|
18
|
+
static isPatching = false; // Mutex (HIGH-02)
|
|
19
|
+
// Fréquence de vérification des modifications du registre (en ms)
|
|
20
|
+
static CHECK_INTERVAL = 60000; // 1 minute
|
|
21
|
+
/**
|
|
22
|
+
* Démarre le Worker en tâche de fond.
|
|
23
|
+
*/
|
|
24
|
+
static start() {
|
|
25
|
+
if (this.isRunning)
|
|
26
|
+
return;
|
|
27
|
+
this.isRunning = true;
|
|
28
|
+
log('[ToolWorker] Démarrage du patcher dynamique...');
|
|
29
|
+
// Exécution immédiate
|
|
30
|
+
this.patchTools();
|
|
31
|
+
// Setup de l'intervalle
|
|
32
|
+
this.interval = setInterval(() => {
|
|
33
|
+
if (ModelRegistry.isReady()) {
|
|
34
|
+
this.patchTools();
|
|
35
|
+
}
|
|
36
|
+
}, this.CHECK_INTERVAL);
|
|
37
|
+
}
|
|
38
|
+
static stop() {
|
|
39
|
+
if (this.interval)
|
|
40
|
+
clearInterval(this.interval);
|
|
41
|
+
this.isRunning = false;
|
|
42
|
+
log('[ToolWorker] Stoppé');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Lit le registre en mémoire et injecte les listes Markdown formatées
|
|
46
|
+
* dans les propriétés ToolDefinition.description
|
|
47
|
+
*/
|
|
48
|
+
static patchTools() {
|
|
49
|
+
if (this.isPatching)
|
|
50
|
+
return;
|
|
51
|
+
this.isPatching = true;
|
|
52
|
+
try {
|
|
53
|
+
// -- Patch VIDEO Tool --
|
|
54
|
+
const videoModels = ModelRegistry.list('video');
|
|
55
|
+
if (videoModels.length > 0 && polliGenVideoTool.description) {
|
|
56
|
+
let videoTable = `\n\n**🎬 Modèles Vidéo Détectés (${videoModels.length}) :**\n`;
|
|
57
|
+
videoTable += `*(Légende: [💎 Paid] = Enter Tier (Consomme le Wallet USD), [🌿 Free] = Free Tier (Consomme d'abord le Quota Pollen Gratuit Journalier))*\n`;
|
|
58
|
+
videoTable += `| Modèle | Source I/O | Audio | 1 pollen ≈ | Specs |\n`;
|
|
59
|
+
videoTable += `|--------|------------|-------|------------|-------|\n`;
|
|
60
|
+
for (const m of videoModels) {
|
|
61
|
+
// Estimation pour une vidéo moyenne de 6 secondes
|
|
62
|
+
const cost = estimateVideoCost(m.name, 6);
|
|
63
|
+
const price = cost ? `${per1pollen(cost)} vidéos` : 'inconnu';
|
|
64
|
+
// durationRange et aspectRatios arrivent du fetcher (ou fallback)
|
|
65
|
+
const specs = `${m.durationRange ? m.durationRange.join('-') + 's' : '?s'} / ${m.aspectRatios ? m.aspectRatios.length : '?'} ratios`;
|
|
66
|
+
const badge = m.paid_only ? '[💎 Paid]' : '[🌿 Free]';
|
|
67
|
+
videoTable += `| \`${m.name}\` ${badge} | ${m.supportsI2X ? 'T2V/I2V' : 'T2V'} | ${m.output_modalities?.includes('audio') || m.name === 'grok-video' ? '✅' : '❌'} | ${price} | ${specs} |\n`;
|
|
68
|
+
}
|
|
69
|
+
if (!polliGenVideoTool.description.includes('**🎬 Modèles Vidéo Détectés')) {
|
|
70
|
+
polliGenVideoTool.description += videoTable;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
polliGenVideoTool.description = polliGenVideoTool.description.split('**🎬 Modèles Vidéo Détectés')[0] + videoTable;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// -- Patch IMAGE Tool --
|
|
77
|
+
const imageModels = ModelRegistry.list('image');
|
|
78
|
+
if (imageModels.length > 0 && polliGenImageTool.description) {
|
|
79
|
+
let imageTable = `\n\n**🎨 Modèles Image Détectés (${imageModels.length}) :**\n`;
|
|
80
|
+
imageTable += `*(Légende: [💎 Paid] = Enter Tier (Consomme le Wallet USD), [🌿 Free] = Free Tier (Consomme d'abord le Quota Pollen Gratuit Journalier))*\n`;
|
|
81
|
+
imageTable += `| Modèle | I2I | Qualité | 1 pollen ≈ |\n`;
|
|
82
|
+
imageTable += `|--------|-----|---------|------------|\n`;
|
|
83
|
+
// Afficher max 20 modèles pour éviter de saturer le prompt LLM
|
|
84
|
+
for (const m of imageModels.slice(0, 20)) {
|
|
85
|
+
const cost = estimateImageCost(m.name);
|
|
86
|
+
const price = cost ? `${per1pollen(cost)} images` : 'inconnu';
|
|
87
|
+
const badge = m.paid_only ? '[💎 Paid]' : '[🌿 Free]';
|
|
88
|
+
imageTable += `| \`${m.name}\` ${badge} | ${m.supportsI2X ? '✅' : '❌'} | Standard | ${price} |\n`;
|
|
89
|
+
}
|
|
90
|
+
if (imageModels.length > 20) {
|
|
91
|
+
imageTable += `| *(+${imageModels.length - 20} autres)* | ... | ... | ... |\n`;
|
|
92
|
+
}
|
|
93
|
+
if (!polliGenImageTool.description.includes('**🎨 Modèles Image Détectés')) {
|
|
94
|
+
polliGenImageTool.description += imageTable;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
polliGenImageTool.description = polliGenImageTool.description.split('**🎨 Modèles Image Détectés')[0] + imageTable;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// -- Patch AUDIO / MUSIC Tool --
|
|
101
|
+
const audioModels = ModelRegistry.list('audio');
|
|
102
|
+
if (audioModels.length > 0 && polliGenAudioTool.description && polliGenMusicTool.description) {
|
|
103
|
+
let audioTable = `\n\n**🎵 Modèles Audio/Music Détectés (${audioModels.length}) :**\n`;
|
|
104
|
+
audioTable += `*(Légende: [💎 Paid] = Enter Tier (Consomme le Wallet USD), [🌿 Free] = Free Tier (Consomme d'abord le Quota Pollen Gratuit Journalier))*\n`;
|
|
105
|
+
audioTable += `| Modèle | Durée max | Qualité |\n`;
|
|
106
|
+
audioTable += `|--------|-----------|---------|\n`;
|
|
107
|
+
for (const m of audioModels) {
|
|
108
|
+
const badge = m.paid_only ? '[💎 Paid]' : '[🌿 Free]';
|
|
109
|
+
const duration = m.durationRange ? `${m.durationRange.join('-')}s` : 'Standard';
|
|
110
|
+
// STT Whispers or TTS or Music
|
|
111
|
+
audioTable += `| \`${m.name}\` ${badge} | ${duration} | Standard |\n`;
|
|
112
|
+
}
|
|
113
|
+
if (!polliGenAudioTool.description.includes('**🎵 Modèles Audio/Music Détectés')) {
|
|
114
|
+
polliGenAudioTool.description += audioTable;
|
|
115
|
+
if (polliGenMusicTool.description && !polliGenMusicTool.description.includes('**🎵 Modèles Audio/Music Détectés')) {
|
|
116
|
+
polliGenMusicTool.description += audioTable;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
polliGenAudioTool.description = polliGenAudioTool.description.split('**🎵 Modèles Audio/Music Détectés')[0] + audioTable;
|
|
121
|
+
if (polliGenMusicTool.description) {
|
|
122
|
+
polliGenMusicTool.description = polliGenMusicTool.description.split('**🎵 Modèles Audio/Music Détectés')[0] + audioTable;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// -- Patch WEB SEARCH Tool --
|
|
127
|
+
const textModels = ModelRegistry.list('text');
|
|
128
|
+
if (textModels.length > 0 && polliWebSearchTool.description) {
|
|
129
|
+
// Filtres selon la volonté stricte utilisateur (inclut explicitement les "gemini", "search", "web", "github", "perplexity")
|
|
130
|
+
const searchKeywords = ['search', 'web', 'github', 'perplexity', 'gemini'];
|
|
131
|
+
const searchModels = textModels.filter(m => {
|
|
132
|
+
const str = `${m.name} ${m.description} ${m.aliases?.join(' ')}`.toLowerCase();
|
|
133
|
+
return searchKeywords.some(kw => str.includes(kw));
|
|
134
|
+
});
|
|
135
|
+
if (searchModels.length > 0) {
|
|
136
|
+
let searchTable = `\n\n**🌍 Modèles de Recherche & Grounding Détectés (${searchModels.length}) :**\n`;
|
|
137
|
+
searchTable += `*(Légende: [💎 Paid] = Enter Tier, [🌿 Free] = Quota Gratuit. Obligatoire de choisir un modèle exact au lieu de 'deep' ou 'rapid' !)*\n`;
|
|
138
|
+
searchTable += `| Modèle | Description / Specs |\n`;
|
|
139
|
+
searchTable += `|--------|---------------------|\n`;
|
|
140
|
+
for (const m of searchModels) {
|
|
141
|
+
const badge = m.paid_only ? '[💎 Paid]' : '[🌿 Free]';
|
|
142
|
+
// Clean markdown piping conflicts
|
|
143
|
+
let cleanDesc = m.description.replace(/\|/g, '-');
|
|
144
|
+
// Adding "Specialized" hint
|
|
145
|
+
let hint = '';
|
|
146
|
+
const lname = m.name.toLowerCase();
|
|
147
|
+
if (lname.includes('nomnom'))
|
|
148
|
+
hint = ' *(Extensif Scrape)*';
|
|
149
|
+
if (lname.includes('polly'))
|
|
150
|
+
hint = ' *(Code/GitHub)*';
|
|
151
|
+
if (lname.includes('gemini-search'))
|
|
152
|
+
hint = ' *(Rapide Google)*';
|
|
153
|
+
if (lname.includes('perplexity'))
|
|
154
|
+
hint = ' *(Sonar Web)*';
|
|
155
|
+
searchTable += `| \`${m.name}\` ${badge} | ${cleanDesc}${hint} |\n`;
|
|
156
|
+
}
|
|
157
|
+
if (!polliWebSearchTool.description.includes('**🌍 Modèles de Recherche & Grounding Détectés')) {
|
|
158
|
+
polliWebSearchTool.description += searchTable;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
polliWebSearchTool.description = polliWebSearchTool.description.split('**🌍 Modèles de Recherche & Grounding Détectés')[0] + searchTable;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
log(`[ToolWorker] Propriétés (descriptions) des outils mises à jour via ModelRegistry.`);
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
log(`[ToolWorker] Error patching tools: ${e}`);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
this.isPatching = false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -41,6 +41,17 @@ export interface DetailedUsageResponse {
|
|
|
41
41
|
count: number;
|
|
42
42
|
}
|
|
43
43
|
export declare function getDetailedUsage(apiKey: string): Promise<DetailedUsageResponse | null>;
|
|
44
|
+
export interface DailyUsageEntry {
|
|
45
|
+
date: string;
|
|
46
|
+
model: string;
|
|
47
|
+
meter_source: 'tier' | 'pack' | 'combined';
|
|
48
|
+
requests: number;
|
|
49
|
+
cost_usd: number;
|
|
50
|
+
}
|
|
51
|
+
export interface DailyUsageResponse {
|
|
52
|
+
usage: DailyUsageEntry[];
|
|
53
|
+
}
|
|
54
|
+
export declare function getDailyUsage(apiKey: string): Promise<DailyUsageResponse | null>;
|
|
44
55
|
export declare function getAggregatedModels(): Promise<{
|
|
45
56
|
object: string;
|
|
46
57
|
data: OpenAIModel[];
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { loadConfig } from './config.js';
|
|
2
|
-
import
|
|
3
|
-
// Debug Helper
|
|
4
|
-
function logDebug(msg) {
|
|
5
|
-
try {
|
|
6
|
-
fs.appendFileSync('/tmp/pollinations-api-debug.log', `[${new Date().toISOString()}] ${msg}\n`);
|
|
7
|
-
}
|
|
8
|
-
catch (e) { }
|
|
9
|
-
}
|
|
2
|
+
import { logApi as logDebug } from './logger.js';
|
|
10
3
|
const HEADERS = {
|
|
11
4
|
'User-Agent': 'curl/8.5.0',
|
|
12
5
|
'Origin': '',
|
|
@@ -136,6 +129,26 @@ export async function getDetailedUsage(apiKey) {
|
|
|
136
129
|
return null;
|
|
137
130
|
}
|
|
138
131
|
}
|
|
132
|
+
export async function getDailyUsage(apiKey) {
|
|
133
|
+
if (!apiKey || apiKey.length < 10)
|
|
134
|
+
return null;
|
|
135
|
+
try {
|
|
136
|
+
logDebug("Fetching Daily Usage (aggregated)...");
|
|
137
|
+
const response = await fetch('https://gen.pollinations.ai/account/usage/daily', {
|
|
138
|
+
headers: { 'Authorization': `Bearer ${apiKey}` }
|
|
139
|
+
});
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
logDebug(`Daily Usage API Error: ${response.status}`);
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const data = await response.json();
|
|
145
|
+
return data;
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
logDebug(`Error Daily Usage: ${e}`);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
139
152
|
export async function getAggregatedModels() {
|
|
140
153
|
const config = loadConfig();
|
|
141
154
|
const [free, enter] = await Promise.all([
|