@voria/cli 0.0.2 → 0.0.4

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # voria
2
2
 
3
- 🚀 **AI-Powered Bug Fixing Tool**
3
+ **AI-Powered Bug Fixing Tool**
4
4
 
5
5
  voria is a CLI tool that automatically fixes bugs and implements features in your codebase. Describe an issue or provide a GitHub issue number, and voria will generate a fix, test it, iterate on failures, and create a pull request - all automatically.
6
6
 
@@ -325,10 +325,11 @@ We welcome contributions! See [Contributing Guide](docs/CONTRIBUTING.md) for:
325
325
 
326
326
 
327
327
  ## Getting Help
328
-
329
- - **[GitHub Discussions](https://github.com/Srizdebnath/voria/discussions)** - Ask questions
330
- - **[GitHub Issues](https://github.com/Srizdebnath/voria/issues)** - Report bugs
331
- - **[Troubleshooting Guide](docs/TROUBLESHOOTING.md)** - Common issues
328
+
329
+ - **[WhatsApp Support Group](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)** - Fastest support
330
+ - **[GitHub Discussions](https://github.com/Srizdebnath/voria/discussions)** - Ask questions
331
+ - **[GitHub Issues](https://github.com/Srizdebnath/voria/issues)** - Report bugs
332
+ - **[Troubleshooting Guide](docs/TROUBLESHOOTING.md)** - Common issues
332
333
 
333
334
  ## Roadmap
334
335
 
@@ -414,12 +415,11 @@ We welcome contributions! See [Contributing Guide](docs/CONTRIBUTING.md) for:
414
415
 
415
416
  **Current Status:** All core features complete and production-ready!
416
417
 
417
- **Coming in v0.2.0:**
418
- - Advanced code dependency analysis
419
- - Risk scoring for patches
420
- - VS Code extension
421
- - GitHub Actions integration
422
- - Self-hosted deployment options
418
+ **Now Available in v0.0.3:**
419
+ - Advanced code dependency analysis (`voria --graph`)
420
+ - Risk scoring for patches & codebase
421
+ - Expanded Chinese model support (Kimi, Minimax, DeepSeek)
422
+ - Enhanced hierarchical structural visualization
423
423
 
424
424
  **Get involved:** [Contributing Guide](docs/CONTRIBUTING.md)
425
425
 
package/bin/voria CHANGED
@@ -5,6 +5,7 @@ import path from 'path';
5
5
  import { fileURLToPath } from 'url';
6
6
  import { spawn } from 'child_process';
7
7
  import readline from 'readline';
8
+ import { execSync } from 'child_process';
8
9
 
9
10
  const __filename = fileURLToPath(import.meta.url);
10
11
  const __dirname = path.dirname(__filename);
@@ -13,6 +14,17 @@ const voria_HOME = path.join(process.env.HOME || process.env.USERPROFILE, '.vori
13
14
  const CONFIG_FILE = path.join(voria_HOME, 'config.json');
14
15
  const PROJECT_CONFIG = path.join(process.cwd(), '.voria.json');
15
16
 
17
+ const PROVIDER_MODELS = {
18
+ openai: ['gpt-4o', 'gpt-4o-mini', 'o1-preview', 'o1-mini'],
19
+ claude: ['claude-3-5-sonnet-20240620', 'claude-3-opus-20240229', 'claude-3-haiku-20240307'],
20
+ gemini: ['gemini-1.5-pro', 'gemini-1.5-flash', 'gemini-1.0-pro'],
21
+ modal: ['llama-3.1-405b', 'llama-3.1-70b', 'mixtral-8x7b'],
22
+ kimi: ['moonshot-v1-8k', 'moonshot-v1-32k', 'moonshot-v1-128k'],
23
+ minimax: ['abab6.5-chat', 'abab6-chat'],
24
+ deepseek: ['deepseek-chat', 'deepseek-coder'],
25
+ siliconflow: ['deepseek-v2.5', 'internlm2_5-20b-chat', 'qwen2.5-72b-instruct']
26
+ };
27
+
16
28
  // ANSI escape codes for blue theme
17
29
  const colors = {
18
30
  blue: (text) => `\x1b[34m${text}\x1b[0m`,
@@ -31,36 +43,39 @@ if (!fs.existsSync(voria_HOME)) {
31
43
  fs.mkdirSync(voria_HOME, { recursive: true });
32
44
  }
33
45
 
34
- const BANNER = colors.brightBlue(`
35
- _ __ _
36
- | | / /___ _____(_)___ _
37
- | | / / __ \\/ ___/ / __ \`/
38
- | |/ / /_/ / / / / /_/ /
39
- |___/\\____/_/ /_/\\__,_/
40
- `);
46
+ const BANNER = `
47
+ ${colors.blue("██╗ ██╗ ██████╗ ██████╗ ██╗ █████╗")}
48
+ ${colors.blue("██║ ██║██╔═══██╗██╔══██╗██║██╔══██╗")}
49
+ ${colors.blue("██║ ██║██║ ██║██████╔╝██║███████║")}
50
+ ${colors.blue("╚██╗ ██╔╝██║ ██║██╔══██╗██║██╔══██╗")}
51
+ ${colors.blue(" ╚████╔╝ ╚██████╔╝██║ ██║██║██║ ██║")}
52
+ `;
41
53
 
42
54
  const HELP_TEXT = `
43
55
  ${BANNER}
44
- ${colors.bgBlue(colors.bold(" ⚡ voria "))} ${colors.blue("- AI-Powered Bug Fixing")}
56
+ ${colors.dim("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")}
57
+ ${colors.dim("┃")} ${colors.bold("AI-Powered Autonomous Fixer")} ${colors.dim("┃")}
58
+ ${colors.dim("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")}
45
59
 
46
60
  ${colors.bold(colors.blue("USAGE:"))}
47
61
  voria [command] [options]
48
62
 
49
63
  ${colors.bold(colors.blue("GLOBAL COMMANDS:"))}
50
- voria --init ${colors.dim("Initialize voria in current project")}
51
- voria --config ${colors.dim("Configure LLM provider and settings")}
52
- voria --set-github-token ${colors.dim("Set your GitHub personal access token")}
53
- voria --list-issues <repo>${colors.dim("List issues in a repository")}
54
- voria --help ${colors.dim("Show this help message")}
55
- voria --version ${colors.dim("Show version information")}
64
+ ${colors.blue("🚀")} voria --init ${colors.dim("Initialize project & choose models")}
65
+ ${colors.blue("⚙️")} voria --config ${colors.dim("Configure LLM provider and settings")}
66
+ ${colors.blue("🔑")} voria --set-github-token ${colors.dim("Set your GitHub personal access token")}
67
+ ${colors.blue("📋")} voria --list-issues <repo>${colors.dim("List issues in a repository")}
68
+ ${colors.blue("🔭")} voria --graph ${colors.dim("Show codebase dependency graph")}
69
+ ${colors.blue("❓")} voria --help ${colors.dim("Show this help message")}
70
+ ${colors.blue("🏷️")} voria --version ${colors.dim("Show current version")}
56
71
 
57
72
  ${colors.bold(colors.blue("PROJECT COMMANDS:"))}
58
- voria plan <desc> ${colors.dim("Propose a fix for a description")}
59
- voria issue <repo> <num> ${colors.dim("Fix a specific GitHub issue")}
60
- voria apply <patch> ${colors.dim("Apply a patch file")}
61
- voria status ${colors.dim("Show current project status")}
62
- voria logs ${colors.dim("Show recent activity logs")}
63
- voria reset ${colors.dim("Reset project configuration")}
73
+ ${colors.blue("🐞")} voria issue <repo> <num> ${colors.dim("Fix a specific GitHub issue")}
74
+ ${colors.blue("📦")} voria apply <patch> ${colors.dim("Apply a patch file")}
75
+ ${colors.blue("📊")} voria status ${colors.dim("Show current project status")}
76
+ ${colors.blue("💰")} voria token info ${colors.dim("Show token usage info")}
77
+ ${colors.blue("📝")} voria logs ${colors.dim("Show recent activity logs")}
78
+ ${colors.blue("🔄")} voria reset ${colors.dim("Reset project configuration")}
64
79
 
65
80
  ${colors.bold(colors.blue("OPTIONS:"))}
66
81
  --llm <provider> ${colors.dim("Use specific LLM (openai, claude, gemini, modal, kimi)")}
@@ -83,7 +98,7 @@ ${BANNER}
83
98
  ${colors.dim("Full documentation:")} ${colors.blue("https://github.com/Srizdebnath/voria")}
84
99
  `;
85
100
 
86
- const VERSION = '0.0.1';
101
+ const VERSION = '0.0.3';
87
102
 
88
103
  // Load configuration
89
104
  function loadConfig() {
@@ -116,7 +131,19 @@ function saveConfig(config, isGlobal = true) {
116
131
  fs.writeFileSync(file, JSON.stringify(config, null, 2));
117
132
  }
118
133
 
119
- // Interactive setup
134
+ /**
135
+ * Dynamically fetch models for a provider using Python backend
136
+ */
137
+ function fetchModels(provider, apiKey) {
138
+ try {
139
+ const scriptPath = path.join(__dirname, '..', 'python', 'voria', 'core', 'llm', 'model_discovery.py');
140
+ const output = execSync(`python3 "${scriptPath}" "${provider}" "${apiKey}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] });
141
+ return JSON.parse(output);
142
+ } catch (e) {
143
+ return [];
144
+ }
145
+ }
146
+
120
147
  // Interactive setup
121
148
  async function runSetup() {
122
149
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
@@ -124,8 +151,9 @@ async function runSetup() {
124
151
 
125
152
  try {
126
153
  console.log(BANNER);
127
- console.log(`${colors.bgBlue(colors.bold(" ⚙️ voria Setup "))} ${colors.blue("Initialize your project")}`);
128
- console.log(`${colors.dim("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")}\n`);
154
+ console.log(` ${colors.dim("┏━━")} ${colors.bold("PROJECT INITIALIZATION")} ${colors.dim("━━┓")}`);
155
+ console.log(` ${colors.dim("")} ${colors.blue("Configuring your intelligence backend")} ${colors.dim("┃")}`);
156
+ console.log(` ${colors.dim("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")}\n`);
129
157
 
130
158
  if (!fs.existsSync(path.join(process.cwd(), '.git'))) {
131
159
  console.log(`${colors.yellow("⚠")} ${colors.bold("Warning:")} Not in a Git repository.`);
@@ -136,10 +164,14 @@ async function runSetup() {
136
164
  console.log(` ${colors.blue("1)")} OpenAI (GPT-4o, GPT-4 Mini)`);
137
165
  console.log(` ${colors.blue("2)")} Claude (Anthropic)`);
138
166
  console.log(` ${colors.blue("3)")} Gemini (Google)`);
139
- console.log(` ${colors.blue("4)")} Modal (Free Tier)\n`);
167
+ console.log(` ${colors.blue("4)")} Modal (Free Tier)`);
168
+ console.log(` ${colors.blue("5)")} Kimi (Moonshot AI)`);
169
+ console.log(` ${colors.blue("6)")} Minimax`);
170
+ console.log(` ${colors.blue("7)")} DeepSeek`);
171
+ console.log(` ${colors.blue("8)")} SiliconFlow\n`);
140
172
 
141
173
  const choice = await question(`${colors.cyan("selection")} › `);
142
- const providers = ['openai', 'claude', 'gemini', 'modal'];
174
+ const providers = ['openai', 'claude', 'gemini', 'modal', 'kimi', 'minimax', 'deepseek', 'siliconflow'];
143
175
  const provider = providers[parseInt(choice) - 1] || 'openai';
144
176
 
145
177
  const apiKey = await question(`${colors.cyan(provider.toUpperCase() + " API Key")} › `);
@@ -150,6 +182,18 @@ async function runSetup() {
150
182
  return;
151
183
  }
152
184
 
185
+ console.log(`\n${colors.dim(" Fetching latest models...")}`);
186
+ const fetchedModels = fetchModels(provider, apiKey);
187
+ const models = fetchedModels.length > 0 ? fetchedModels.map(m => m.name) : (PROVIDER_MODELS[provider] || ['gpt-4o']);
188
+
189
+ console.log(`\n${colors.bold("Select Model:")}`);
190
+ models.forEach((model, index) => {
191
+ console.log(` ${colors.blue((index + 1) + ")")} ${model}`);
192
+ });
193
+
194
+ const modelChoice = await question(`\n${colors.cyan("selection")} ${colors.dim("(1)")} › `) || '1';
195
+ const selectedModel = models[parseInt(modelChoice) - 1] || models[0];
196
+
153
197
  const budget = await question(`${colors.cyan("Daily Budget ($)")} ${colors.dim("(10.0)")} › `) || '10.0';
154
198
 
155
199
  console.log(`\n${colors.bold("Test Framework:")}`);
@@ -163,6 +207,7 @@ async function runSetup() {
163
207
 
164
208
  const config = {
165
209
  llm_provider: provider,
210
+ model: selectedModel,
166
211
  daily_budget: parseFloat(budget),
167
212
  test_framework: framework,
168
213
  created_at: new Date().toISOString()
@@ -191,13 +236,15 @@ async function runConfig() {
191
236
  const question = (prompt) => new Promise(resolve => rl.question(prompt, resolve));
192
237
 
193
238
  try {
194
- console.log(`\n${colors.bgBlue(colors.bold(" 🔧 Configuration "))}`);
239
+ console.log(`\n ${colors.dim("┏━━")} ${colors.bold("SETTINGS ENGINE")} ${colors.dim("━━┓")}`);
240
+ console.log(` ${colors.dim("┃")} ${colors.blue("Adjusting your local parameters")} ${colors.dim("┃")}`);
241
+ console.log(` ${colors.dim("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")}\n`);
242
+
195
243
  const config = loadConfig();
196
244
 
197
- console.log(`${colors.bold("Current Settings:")}`);
198
- console.log(` Provider: ${colors.blue(config.llm_provider || 'None')}`);
199
- console.log(` Budget: ${colors.green("$" + (config.daily_budget || '10.0'))}`);
200
- console.log(` Framework: ${colors.cyan(config.test_framework || 'None')}\n`);
245
+ console.log(` ${colors.dim("Provider:")} ${colors.blue(config.llm_provider || 'None')}`);
246
+ console.log(` ${colors.dim("Budget:")} ${colors.green("$" + (config.daily_budget || '10.0'))}`);
247
+ console.log(` ${colors.dim("Framework:")} ${colors.cyan(config.test_framework || 'None')}\n`);
201
248
 
202
249
  const change = await question(`${colors.cyan("edit")} ${colors.dim("(provider/budget/framework/none)")} › `);
203
250
 
@@ -583,6 +630,41 @@ async function callPythonEngine(command) {
583
630
  });
584
631
  }
585
632
 
633
+ // Helper function to call Rust core
634
+ async function runRustCore(args) {
635
+ const { spawn } = await import('child_process');
636
+ const pathMod = await import('path');
637
+ const fsMod = await import('fs');
638
+
639
+ return new Promise((resolve, reject) => {
640
+ // Try to find the rust binary
641
+ const possiblePaths = [
642
+ pathMod.default.join(__dirname, '..', 'target', 'release', 'voria'),
643
+ pathMod.default.join(__dirname, '..', 'target', 'debug', 'voria'),
644
+ pathMod.default.join(__dirname, '..', 'rust', 'target', 'release', 'voria'),
645
+ pathMod.default.join(__dirname, '..', 'rust', 'target', 'debug', 'voria'),
646
+ ];
647
+
648
+ let rustBin = possiblePaths.find(p => fsMod.default.existsSync(p));
649
+
650
+ if (!rustBin) {
651
+ // Check if it's in the system path
652
+ try {
653
+ execSync('voria --version', { stdio: 'ignore' });
654
+ rustBin = 'voria';
655
+ } catch (e) {
656
+ return reject(new Error('Rust core binary (voria) not found. Please run "cargo build --release" in the rust directory.'));
657
+ }
658
+ }
659
+
660
+ const child = spawn(rustBin, args, { stdio: 'inherit' });
661
+ child.on('exit', (code) => {
662
+ if (code === 0) resolve();
663
+ else reject(new Error(`Rust core exited with code ${code}`));
664
+ });
665
+ });
666
+ }
667
+
586
668
  // Main CLI router
587
669
  async function main() {
588
670
  const args = process.argv.slice(2);
@@ -717,6 +799,15 @@ async function main() {
717
799
  break;
718
800
  }
719
801
 
802
+ case '--graph':
803
+ try {
804
+ await runRustCore(['--graph']);
805
+ } catch (error) {
806
+ console.error(`${colors.red("✖")} Error running analysis: ${error.message}`);
807
+ console.log(`${colors.yellow("💡")} Make sure to build the rust core: ${colors.bold("cargo build --release")}`);
808
+ }
809
+ break;
810
+
720
811
  default:
721
812
  console.log(`\n❌ Unknown command: ${command}`);
722
813
  console.log(' Run: voria --help\n');
@@ -6,30 +6,30 @@ voria's system design and component overview.
6
6
 
7
7
  ```
8
8
  ┌─────────────────────────────────────────────────────────────┐
9
- │ voria CLI
9
+ │ voria CLI
10
10
  │ (Node.js - Entry Point) │
11
11
  │ │
12
12
  │ ┌────────────────────────────────────────────────────────┐ │
13
- │ │ Command Dispatcher (--init, --config, issue, plan) │ │
13
+ │ │ Command Dispatcher (--init, --config, issue, plan) │ │
14
14
  │ ├────────────────────────────────────────────────────────┤ │
15
15
  │ │ UI Layer (Premium Blue Theme, ANSI styling) │ │
16
16
  │ ├────────────────────────────────────────────────────────┤ │
17
17
  │ │ IPC Manager (Process orchestration, NDJSON) │ │
18
18
  │ └────────────────────────────────────────────────────────┘ │
19
- │ │
20
- │ │ NDJSON (stdin/stdout)
21
- │ ▼
19
+ │ │
20
+ │ │ NDJSON (stdin/stdout)
21
+ │ ▼
22
22
  └─────────────────────────────────────────────────────────────┘
23
23
 
24
24
  │ Persistent Child Process
25
25
 
26
26
 
27
27
  ┌─────────────────────────────────────────────────────────────┐
28
- │ voria Engine
29
- │ (Python - AI Core)
28
+ │ voria Engine
29
+ │ (Python - AI Core)
30
30
  │ │
31
31
  │ ┌────────────────────────────────────────────────────────┐ │
32
- │ │ Agent Loop (Plan → Patch → Apply → Test → Iterate) │ │
32
+ │ │ Agent Loop (Plan → Patch → Apply → Test → Iterate) │ │
33
33
  │ ├────────────────────────────────────────────────────────┤ │
34
34
  │ │ LLM Adapters (Claude, OpenAI, Gemini, Modal, Kimi) │ │
35
35
  │ ├────────────────────────────────────────────────────────┤ │
@@ -37,16 +37,16 @@ voria's system design and component overview.
37
37
  │ ├────────────────────────────────────────────────────────┤ │
38
38
  │ │ Code Patcher & Test Executor │ │
39
39
  │ └────────────────────────────────────────────────────────┘ │
40
- │ │
41
- │ │ NDJSON responses
42
- │ ▼
40
+ │ │
41
+ │ │ NDJSON response |
42
+ │ ▼
43
43
  └─────────────────────────────────────────────────────────────┘
44
44
 
45
45
  │ (Optional / Planned)
46
46
 
47
47
  ┌─────────────────────────────────────────────────────────────┐
48
- │ voria Hub
49
- │ (Rust - High Perf)
48
+ │ voria Hub
49
+ │ (Rust - High Perf)
50
50
  │ │
51
51
  │ ┌────────────────────────────────────────────────────────┐ │
52
52
  │ │ Fast FS Operations │ │
@@ -417,3 +417,7 @@ Future capabilities can be added at these points:
417
417
  - [IPC_PROTOCOL.md](IPC_PROTOCOL.md) - Detailed protocol spec
418
418
  - [MODULES.md](MODULES.md) - Component documentation
419
419
  - [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Design rationale
420
+
421
+ ---
422
+
423
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/CHANGELOG.md CHANGED
@@ -2,12 +2,33 @@
2
2
 
3
3
  All notable changes to voria are documented here.
4
4
 
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/v0.0.1/),
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/v0.0.3/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ---
9
9
 
10
- ## [v0.0.1] - April 10, 2026 ✅ PRODUCTION RELEASE
10
+ ## [v0.0.3] - April 12, 2026 ✅ ADVANCED ANALYSIS & CHINESE MODELS
11
+
12
+ ### 🔭 Advanced Code Analysis (New)
13
+ - **Hierarchical Dependency Graph** via `voria --graph`
14
+ - **Level-by-level visualization** (Root → Level 1 → Level 2)
15
+ - **Risk Integrity Scoring** based on coupling and complexity
16
+ - **Hot Spot Detection** for complex/unstable modules
17
+ - **Super-fast Rust implementation** for non-LLM static analysis
18
+ - **Progress interaction** with estimated time remaining
19
+ - **Automatic filtering** of generated/hidden directories (`.next`, `dist`, `build`)
20
+
21
+ ### 🤖 Expanded Model Support
22
+ - Support for **Kimi**, **Minimax**, **DeepSeek**, and **SiliconFlow**
23
+ - **Detailed model selection** wizard in `voria --init`
24
+ - Unified model configuration across all providers
25
+
26
+ ### 🔗 Support & Community
27
+ - **WhatsApp Support Group:** https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t
28
+ - **Documentation Overhaul:** Updated all docs to v0.0.3
29
+ - **Enhanced Contributor Setup:** Improved local development guides
30
+
31
+ ## [v0.0.3] - April 12, 2026 ✅ PRODUCTION RELEASE
11
32
 
12
33
  ### 🎉 Major Release: Feature Complete
13
34
 
@@ -75,8 +96,8 @@ All planned features through Phase 8 are now complete and production-ready.
75
96
  - **New CHANGELOG.md** - This file
76
97
 
77
98
  ### Distribution
78
- - **Published to npm** as `@srizdebnath/voria@0.0.3`
79
- - **Global CLI tool** - Install with `npm install -g @srizdebnath/voria`
99
+ - **Published to npm** as `@voria/cli@0.0.3`
100
+ - **Global CLI tool** - Install with `npm install -g @voria/cli`
80
101
  - **Pre-built binaries** - No build required for end users
81
102
 
82
103
  ### Testing
@@ -97,7 +118,7 @@ All planned features through Phase 8 are now complete and production-ready.
97
118
 
98
119
  ---
99
120
 
100
- ## [v0.0.1] - April 2026
121
+ ## [v0.0.3] - April 2026
101
122
 
102
123
  ### Phase 3: Configuration & Setup
103
124
  - Interactive setup wizard (`voria --init`)
@@ -118,7 +139,7 @@ All planned features through Phase 8 are now complete and production-ready.
118
139
 
119
140
  ---
120
141
 
121
- ## [v0.0.1] - April 2026
142
+ ## [v0.0.3] - April 2026
122
143
 
123
144
  ### Phase 1: Core Foundation
124
145
  - Rust CLI base structure
@@ -145,7 +166,7 @@ All planned features through Phase 8 are now complete and production-ready.
145
166
  - Cost allocation
146
167
  - Team collaboration features
147
168
 
148
- ### vv0.0.1 (Q4 2026) - Stable API
169
+ ### vv0.0.3 (Q4 2026) - Stable API
149
170
  - Stable API guarantees
150
171
  - VS Code extension
151
172
  - GitHub Actions integration
@@ -158,14 +179,14 @@ All planned features through Phase 8 are now complete and production-ready.
158
179
 
159
180
  | Phase | Name | Status | Version |
160
181
  |-------|------|--------|---------|
161
- | 1 | Foundation | ✅ Complete | v0.0.1 |
162
- | 2 | Automation | ✅ Complete | v0.0.1 |
163
- | 3 | Setup & Config | ✅ Complete | v0.0.1 |
164
- | 4 | LLM Integration | ✅ Complete | v0.0.1 |
165
- | 5 | GitHub Integration | ✅ Complete | v0.0.1 |
166
- | 6 | Code Analysis | ✅ Complete | v0.0.1 |
167
- | 7 | Testing & Validation | ✅ Complete | v0.0.1 |
168
- | 8 | Agent Loop | ✅ Complete | v0.0.1 |
182
+ | 1 | Foundation | ✅ Complete | v0.0.3 |
183
+ | 2 | Automation | ✅ Complete | v0.0.3 |
184
+ | 3 | Setup & Config | ✅ Complete | v0.0.3 |
185
+ | 4 | LLM Integration | ✅ Complete | v0.0.3 |
186
+ | 5 | GitHub Integration | ✅ Complete | v0.0.3 |
187
+ | 6 | Code Analysis | ✅ Complete | v0.0.3 |
188
+ | 7 | Testing & Validation | ✅ Complete | v0.0.3 |
189
+ | 8 | Agent Loop | ✅ Complete | v0.0.3 |
169
190
  | 9 | Advanced Analysis | 📋 Planned | v0.1.0 |
170
191
  | 10 | Enterprise | 📋 Planned | v0.2.0 |
171
192
 
@@ -184,6 +205,11 @@ All planned features through Phase 8 are now complete and production-ready.
184
205
  ## Links
185
206
 
186
207
  - **GitHub:** https://github.com/Srizdebnath/voria
187
- - **npm:** https://www.npmjs.com/package/@srizdebnath/voria
208
+ - **npm:** https://www.npmjs.com/package/@voria/cli
188
209
  - **Issues:** https://github.com/Srizdebnath/voria/issues
189
210
  - **Discussions:** https://github.com/Srizdebnath/voria/discussions
211
+ - **WhatsApp Support:** https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t
212
+
213
+ ---
214
+
215
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -436,7 +436,6 @@ Every contribution - big or small - helps make voria better. Thank you for being
436
436
  **Next Steps:**
437
437
  - Read [DEVELOPMENT.md](DEVELOPMENT.md) for detailed setup
438
438
  - Check out [good-first-issue](https://github.com/Srizdebnath/voria/labels/good-first-issue) on GitHub
439
- - Join our [Discord community](https://discord.gg/voria)
440
439
 
441
440
  ---
442
441
 
@@ -445,3 +444,7 @@ Every contribution - big or small - helps make voria better. Thank you for being
445
444
  - [ROADMAP.md](ROADMAP.md) - Where we're heading
446
445
  - [PLUGINS.md](PLUGINS.md) - Plugin development guide
447
446
  - [LLM_INTEGRATION.md](LLM_INTEGRATION.md) - Adding LLM providers
447
+
448
+ ---
449
+
450
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -378,3 +378,7 @@ voria/
378
378
  **See Also:**
379
379
  - [ARCHITECTURE.md](ARCHITECTURE.md) - System design
380
380
  - [MODULES.md](MODULES.md) - Component details
381
+
382
+ ---
383
+
384
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -501,7 +501,7 @@ cargo build --release
501
501
 
502
502
  ### "Cargo not found"
503
503
  ```bash
504
- curl --proto '=https' --tlsvv0.0.1 -sSf https://sh.rustup.rs | sh
504
+ curl --proto '=https' --tlsvv0.0.3 -sSf https://sh.rustup.rs | sh
505
505
  source $HOME/.cargo/env
506
506
  ```
507
507
 
@@ -533,3 +533,7 @@ pytest tests/ -v -s --tb=long
533
533
  ---
534
534
 
535
535
  **Need Help?** Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md) or ask in discussions.
536
+
537
+ ---
538
+
539
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/EXAMPLES.md CHANGED
@@ -432,3 +432,7 @@ diff <(voria issue 42 --llm openai --output json) \
432
432
  ---
433
433
 
434
434
  **Try these examples!** Start with simplest (Example 1) and work up to more complex ones.
435
+
436
+ ---
437
+
438
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/INSTALL.md CHANGED
@@ -17,7 +17,6 @@ Complete instructions for installing and using voria.
17
17
  ### Optional (for specific features)
18
18
  - **pytest** - For Python test execution support
19
19
  - **Docker** - For sandboxed test runs
20
- - **GraphQL client** - For GitHub Enterprise
21
20
 
22
21
  ## Quick Install (Recommended)
23
22
 
@@ -25,10 +24,10 @@ Complete instructions for installing and using voria.
25
24
 
26
25
  ```bash
27
26
  # Install globally
28
- npm install -g @srizdebnath/voria
27
+ npm install -g @voria/cli
29
28
 
30
29
  # Verify installation
31
- voria --version # Should show v0.0.1
30
+ voria --version # Should show v0.0.3
32
31
 
33
32
  # Initialize in your project
34
33
  cd your-project
@@ -271,7 +270,7 @@ pytest -v
271
270
 
272
271
  ```bash
273
272
  # Install Rust
274
- curl --proto '=https' --tlsvv0.0.1 -sSf https://sh.rustup.rs | sh
273
+ curl --proto '=https' --tlsvv0.0.3 -sSf https://sh.rustup.rs | sh
275
274
  source $HOME/.cargo/env
276
275
  ```
277
276
 
@@ -326,10 +325,14 @@ cd python && pip install -e . --force-reinstall
326
325
  ## Need Help?
327
326
 
328
327
  - Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
329
- - Read [DEVELOPMENT.md](DEVELOPMENT.md)
330
- - Search [GitHub Issues](https://github.com/Srizdebnath/voria/issues)
331
- - Open a new issue
328
+ - [GitHub Repository](https://github.com/Srizdebnath/voria)
329
+ - [Issue Tracker](https://github.com/Srizdebnath/voria/issues)
330
+ - [Email Contact](mailto:srizd449@gmail.com)
332
331
 
333
332
  ---
334
333
 
335
334
  **Installation Complete!** Continue with [QUICKSTART.md](QUICKSTART.md) 🚀
335
+
336
+ ---
337
+
338
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -308,3 +308,7 @@ Currently no versioning mechanism. Once protocol is stable, add version field:
308
308
  ...
309
309
  }
310
310
  ```
311
+
312
+ ---
313
+
314
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -250,7 +250,7 @@ PROVIDER_PRICING = {
250
250
  "currency": "USD"
251
251
  },
252
252
  "openai": {
253
- "input_price": 0.0025, # Per 1K tokens
253
+ "input_price": 0.0.35, # Per 1K tokens
254
254
  "output_price": 0.010,
255
255
  "currency": "USD"
256
256
  },
@@ -266,7 +266,7 @@ PROVIDER_PRICING = {
266
266
  },
267
267
  "kimi": { # ← Add this
268
268
  "input_price": 0.0006, # Per 1K tokens
269
- "output_price": 0.0018,
269
+ "output_price": 0.0.38,
270
270
  "currency": "Yuan (CNY)"
271
271
  },
272
272
  }
@@ -414,3 +414,7 @@ class OllamaProvider(BaseLLMProvider):
414
414
  - [MODULES.md](MODULES.md) - `llm/` module documentation
415
415
  - [DEVELOPMENT.md](DEVELOPMENT.md) - Development setup
416
416
  - [PLUGINS.md](PLUGINS.md) - Plugin development (for test executors, etc)
417
+
418
+ ---
419
+
420
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/MODULES.md CHANGED
@@ -468,3 +468,7 @@ if test_result.passed == test_result.total:
468
468
  **See Also:**
469
469
  - [ARCHITECTURE.md](ARCHITECTURE.md) - System design
470
470
  - [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Why these choices
471
+
472
+ ---
473
+
474
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -344,3 +344,7 @@ python3 -m py_compile voria/
344
344
  - [SECURITY.md](SECURITY.md) - Security best practices
345
345
  - [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues
346
346
  - [ARCHITECTURE.md](ARCHITECTURE.md) - System design
347
+
348
+ ---
349
+
350
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/PLUGINS.md CHANGED
@@ -430,3 +430,7 @@ class KotlinParser:
430
430
  - [DEVELOPMENT.md](DEVELOPMENT.md) - Dev environment setup
431
431
  - [MODULES.md](MODULES.md) - Module documentation
432
432
  - [LLM_INTEGRATION.md](LLM_INTEGRATION.md) - Add new LLM providers
433
+
434
+ ---
435
+
436
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -8,7 +8,7 @@ Get voria running in 5 minutes or less!
8
8
 
9
9
  ```bash
10
10
  # Install globally from npm
11
- npm install -g @srizdebnath/voria
11
+ npm install -g @voria/cli
12
12
 
13
13
  # Verify
14
14
  voria --version
@@ -182,3 +182,7 @@ cd ..
182
182
  ---
183
183
 
184
184
  **Ready to go deeper?** → [USER_GUIDE.md](USER_GUIDE.md) 🚀
185
+
186
+ ---
187
+
188
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/README.md CHANGED
@@ -116,18 +116,21 @@ LLM Providers (OpenAI, Gemini, Claude, Modal)
116
116
  ## External Resources
117
117
 
118
118
  - [GitHub Repository](https://github.com/Srizdebnath/voria)
119
- - [Main README](../README.md)
120
119
  - [Issue Tracker](https://github.com/Srizdebnath/voria/issues)
121
- - [Discussions](https://github.com/Srizdebnath/voria/discussions)
120
+ - [Email Contact](mailto:srizd449@gmail.com)
122
121
 
123
122
  ## Questions?
124
123
 
125
124
  - Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md) for common issues
126
125
  - Read [EXAMPLES.md](EXAMPLES.md) for usage patterns
127
- - See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution process
126
+ - Contact: [srizd449@gmail.com](mailto:srizd449@gmail.com)
128
127
  - Open an issue on GitHub
129
128
 
130
129
  ---
131
130
 
132
- **Last Updated:** April 10, 2026
133
- **Documentation Version:** 2.0
131
+ **Last Updated:** April 12, 2026
132
+ **Documentation Version:** 0.0.3
133
+
134
+ ---
135
+
136
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/ROADMAP.md CHANGED
@@ -4,7 +4,7 @@ voria's feature roadmap and product vision.
4
4
 
5
5
  ## Current Status: PRODUCTION READY ✅
6
6
 
7
- voria is feature-complete for its first official release (**v0.0.1**). All core orchestration, LLM, and GitHub integration components are stable and distributed via npm.
7
+ voria is feature-complete for its first official release (**v0.0.3**). All core orchestration, LLM, and GitHub integration components are stable and distributed via npm.
8
8
 
9
9
  **Phase 1: Core Orchestration** ✅ COMPLETE
10
10
  - Node.js CLI entry point with premium blue theme
@@ -26,7 +26,7 @@ voria is feature-complete for its first official release (**v0.0.1**). All core
26
26
  - Failure analysis and automatic refinement (up to 5 iterations)
27
27
  - Safe patch application with rollback support
28
28
 
29
- **Phase 5: First Release (v0.0.1)** ✅ COMPLETE
29
+ **Phase 5: First Release (v0.0.3)** ✅ COMPLETE
30
30
  - Public publication to npm as `@srizdebnath/voria`
31
31
  - Integrated documentation and help system
32
32
  - 100% test pass rate for CLI and Engine
@@ -164,12 +164,12 @@ Context sent to LLM: 2,000 lines # Same quality, less cost
164
164
 
165
165
  | Version | Status | Release Date | Key Features |
166
166
  |---------|--------|--------------|--------------|
167
- | v0.0.1 | ✅ Released | April 2026 | Basic foundation |
168
- | v0.0.1 | ✅ Released | April 2026 | Full LLM support |
169
- | v0.0.1 | ✅ Released | Apr 10, 2026 | Production-ready |
167
+ | v0.0.3 | ✅ Released | April 2026 | Basic foundation |
168
+ | v0.0.3 | ✅ Released | April 2026 | Full LLM support |
169
+ | v0.0.3 | ✅ Released | Apr 10, 2026 | Production-ready |
170
170
  | v0.1.0 | 📋 Planned | Q2 2026 | Advanced analysis |
171
171
  | v0.2.0 | 📋 Planned | Q3 2026 | Enterprise features |
172
- | vv0.0.1 | 📋 Planned | Q4 2026 | Stable API + IDE integration |
172
+ | vv0.0.3 | 📋 Planned | Q4 2026 | Stable API + IDE integration |
173
173
 
174
174
  ---
175
175
 
@@ -220,7 +220,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
220
220
  - Plugin system
221
221
  - More LLM providers (Modal, Gemini, Claude, Kimi)
222
222
 
223
- ### v0.0.1 (April 2026) ✅
223
+ ### v0.0.3 (April 2026) ✅
224
224
  - Enhanced test failure analysis
225
225
  - Batch processing
226
226
  - Performance improvements
@@ -344,3 +344,7 @@ voria --report-beta-issue graph-analysis
344
344
  - [ARCHITECTURE.md](ARCHITECTURE.md) - Current system design
345
345
  - [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Why things are the way they are
346
346
  - [CONTRIBUTING.md](CONTRIBUTING.md) - How to contribute
347
+
348
+ ---
349
+
350
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/docs/SECURITY.md CHANGED
@@ -155,7 +155,7 @@ voria respects system HTTP proxy:
155
155
  # Set system proxy (voria uses it automatically)
156
156
  export HTTP_PROXY="http://proxy.example.com:8080"
157
157
  export HTTPS_PROXY="https://proxy.example.com:8443"
158
- export NO_PROXY="localhost,127.0.0.1"
158
+ export NO_PROXY="localhost,127.0.0.3"
159
159
 
160
160
  voria plan 1 # Uses proxy automatically
161
161
  ```
@@ -332,3 +332,7 @@ For enterprise:
332
332
  - [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Security decisions
333
333
  - [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues
334
334
  - [PERFORMANCE.md](PERFORMANCE.md) - Performance tuning
335
+
336
+ ---
337
+
338
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -14,7 +14,7 @@ command not found: cargo
14
14
  **Solution:**
15
15
  ```bash
16
16
  # Install Rust
17
- curl --proto '=https' --tlsvv0.0.1 -sSf https://sh.rustup.rs | sh
17
+ curl --proto '=https' --tlsvv0.0.3 -sSf https://sh.rustup.rs | sh
18
18
 
19
19
  # Add to PATH
20
20
  source $HOME/.cargo/env
@@ -563,3 +563,7 @@ tar czf voria-debug.tar.gz *.txt *.log
563
563
  - [PERFORMANCE.md](PERFORMANCE.md) - Speed optimization
564
564
  - [SECURITY.md](SECURITY.md) - Security issues
565
565
  - [DEVELOPMENT.md](DEVELOPMENT.md) - Development setup issues
566
+
567
+ ---
568
+
569
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
@@ -144,6 +144,37 @@ voria fix 42 ansh/voria -v
144
144
  - `-v, --verbose` - Show detailed output and debug information
145
145
  - `--config <PATH>` - Use specific config file
146
146
 
147
+ ### `voria --graph`
148
+
149
+ Advanced structural analysis and dependency visualization.
150
+
151
+ **Usage:**
152
+ ```bash
153
+ voria --graph
154
+ ```
155
+
156
+ **What it does:**
157
+ - Scans the entire codebase for dependencies and circular imports
158
+ - Generates a hierarchical tree view of folders and files
159
+ - Visualizes "imports" relationships at every level
160
+ - Calculates a **Risk Integrity Score** based on coupling and complexity
161
+ - Identifies **Hot Spots** (most complex/unstable modules)
162
+ - Provides actionable maintenance insights
163
+
164
+ **Output Example:**
165
+ ```
166
+ 🔭 Voria Multi-Level Dependency Tree
167
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
168
+ ├── 📁 src (3 files, 450 lines)
169
+ │ ├── 📄 main.rs → imports [cli.rs, config.rs]
170
+ │ └── 📁 cli (2 files, 300 lines)
171
+ │ └── 📄 mod.rs → imports [orchestrator.rs]
172
+ └── 📄 README.md
173
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
174
+
175
+ ⚖️ Ecosystem Health Index: 3.2/10.0 [EXCELLENT]
176
+ ```
177
+
147
178
  ---
148
179
 
149
180
  ### `voria plan [ISSUE_ID]`
@@ -698,3 +729,7 @@ Team leads can create `voria.config.json` in repo root:
698
729
  - [PERFORMANCE.md](PERFORMANCE.md) - Speed optimization
699
730
  - [SECURITY.md](SECURITY.md) - Security best practices
700
731
  - [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues
732
+
733
+ ---
734
+
735
+ **Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voria/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "AI-powered CLI tool for automated bug fixing - initialize with voria --init",
5
5
  "main": "bin/voria",
6
6
  "type": "module",
@@ -5,9 +5,10 @@ Fetches available models at runtime based on API keys.
5
5
 
6
6
  import asyncio
7
7
  import httpx
8
- from dataclasses import dataclass
8
+ from dataclasses import dataclass, asdict
9
9
  from typing import List, Optional
10
10
  import logging
11
+ import json
11
12
 
12
13
  logger = logging.getLogger(__name__)
13
14
 
@@ -26,6 +27,36 @@ class ModelInfo:
26
27
  class ModelDiscovery:
27
28
  """Fetch available models from LLM providers."""
28
29
 
30
+ @staticmethod
31
+ async def fetch_generic_openai_compatible(api_key: str, base_url: str, provider_name: str) -> List[ModelInfo]:
32
+ """Fetch models from an OpenAI-compatible API."""
33
+ try:
34
+ async with httpx.AsyncClient() as client:
35
+ response = await client.get(
36
+ f"{base_url.rstrip('/')}/models",
37
+ headers={"Authorization": f"Bearer {api_key}"},
38
+ timeout=10.0,
39
+ )
40
+ if response.status_code == 200:
41
+ data = response.json()
42
+ models = []
43
+ for model in data.get("data", []):
44
+ model_id = model.get("id", "")
45
+ models.append(
46
+ ModelInfo(
47
+ name=model_id,
48
+ display_name=model_id,
49
+ description=f"{provider_name} Model",
50
+ )
51
+ )
52
+ return models
53
+ else:
54
+ logger.warning(f"{provider_name} API returned {response.status_code}")
55
+ return []
56
+ except Exception as e:
57
+ logger.warning(f"Failed to fetch {provider_name} models: {e}")
58
+ return []
59
+
29
60
  @staticmethod
30
61
  async def fetch_modal_models(api_key: str) -> List[ModelInfo]:
31
62
  """Fetch available models from Modal Z.ai API."""
@@ -39,7 +70,6 @@ class ModelDiscovery:
39
70
  if response.status_code == 200:
40
71
  data = response.json()
41
72
  models = []
42
- # Modal returns model data in "data" key
43
73
  for model in data.get("data", []):
44
74
  models.append(
45
75
  ModelInfo(
@@ -49,34 +79,16 @@ class ModelDiscovery:
49
79
  description=f"Modal Z.ai - {model.get('created', 'N/A')}",
50
80
  )
51
81
  )
52
- return (
53
- models if models else await ModelDiscovery._get_modal_fallback()
54
- )
55
- else:
56
- logger.warning(
57
- f"Modal API returned {response.status_code}, using fallback models"
58
- )
59
- return await ModelDiscovery._get_modal_fallback()
60
- except Exception as e:
61
- logger.warning(f"Failed to fetch Modal models: {e}, using fallback")
82
+ return models if models else await ModelDiscovery._get_modal_fallback()
83
+ return await ModelDiscovery._get_modal_fallback()
84
+ except Exception:
62
85
  return await ModelDiscovery._get_modal_fallback()
63
86
 
64
87
  @staticmethod
65
88
  async def _get_modal_fallback() -> List[ModelInfo]:
66
- """Fallback models for Modal when API unavailable."""
67
89
  return [
68
- ModelInfo(
69
- name="zai-org/GLM-5.1-FP8",
70
- display_name="GLM-5.1-FP8 (745B, Latest)",
71
- max_tokens=4096,
72
- description="Latest Modal Z.ai model - 745B parameters",
73
- ),
74
- ModelInfo(
75
- name="zai-org/GLM-4",
76
- display_name="GLM-4 (370B, Legacy)",
77
- max_tokens=2048,
78
- description="Previous generation Modal model",
79
- ),
90
+ ModelInfo(name="zai-org/GLM-5.1-FP8", display_name="GLM-5.1-FP8 (Latest)"),
91
+ ModelInfo(name="zai-org/GLM-4", display_name="GLM-4 (Legacy)"),
80
92
  ]
81
93
 
82
94
  @staticmethod
@@ -92,81 +104,26 @@ class ModelDiscovery:
92
104
  if response.status_code == 200:
93
105
  data = response.json()
94
106
  models = []
95
- # Filter to only gpt models suitable for text generation
96
- suitable_models = {
97
- "gpt-4o",
98
- "gpt-4-turbo",
99
- "gpt-4",
100
- "gpt-3.5-turbo",
101
- }
107
+ suitable_prefixes = {"gpt-4", "gpt-3.5", "o1-"}
102
108
  for model in data.get("data", []):
103
109
  model_id = model.get("id", "")
104
- # Match by prefix or exact name
105
- if any(
106
- model_id.startswith(prefix) for prefix in suitable_models
107
- ):
108
- models.append(
109
- ModelInfo(
110
- name=model_id,
111
- display_name=model_id,
112
- description=f"OpenAI - {model.get('owned_by', 'N/A')}",
113
- )
114
- )
115
- # Sort by recency (gpt-4o > gpt-4-turbo > gpt-4 > gpt-3.5-turbo)
116
- return (
117
- sorted(
118
- models,
119
- key=lambda x: (
120
- not x.name.startswith("gpt-4o"),
121
- not x.name.startswith("gpt-4-turbo"),
122
- not x.name.startswith("gpt-4"),
123
- ),
124
- )
125
- if models
126
- else await ModelDiscovery._get_openai_fallback()
127
- )
128
- else:
129
- logger.warning(
130
- f"OpenAI API returned {response.status_code}, using fallback models"
131
- )
132
- return await ModelDiscovery._get_openai_fallback()
133
- except Exception as e:
134
- logger.warning(f"Failed to fetch OpenAI models: {e}, using fallback")
110
+ if any(model_id.startswith(p) for p in suitable_prefixes):
111
+ models.append(ModelInfo(name=model_id, display_name=model_id))
112
+ return models if models else await ModelDiscovery._get_openai_fallback()
113
+ return await ModelDiscovery._get_openai_fallback()
114
+ except Exception:
135
115
  return await ModelDiscovery._get_openai_fallback()
136
116
 
137
117
  @staticmethod
138
118
  async def _get_openai_fallback() -> List[ModelInfo]:
139
- """Fallback models for OpenAI when API unavailable."""
140
119
  return [
141
- ModelInfo(
142
- name="gpt-5.4",
143
- display_name="GPT-5.4 (Latest Frontier)",
144
- max_tokens=128000,
145
- description="Best intelligence at scale for agentic, coding, and professional workflows. $2.50 input, $15 output per 1M tokens",
146
- ),
147
- ModelInfo(
148
- name="gpt-5.4-mini",
149
- display_name="GPT-5.4-mini (Mini Model)",
150
- max_tokens=128000,
151
- description="Strongest mini model yet for coding, computer use, and agentic tasks. $0.75 input, $4.50 output per 1M tokens",
152
- ),
153
- ModelInfo(
154
- name="gpt-5.4-nano",
155
- display_name="GPT-5.4-nano (Cheapest)",
156
- max_tokens=128000,
157
- description="Cheapest GPT-5.4-class model for simple high-volume tasks. $0.20 input, $1.25 output per 1M tokens",
158
- ),
159
- ModelInfo(
160
- name="gpt-4o",
161
- display_name="GPT-4o (Previous High Quality)",
162
- max_tokens=128000,
163
- description="Previous latest model - optimized for speed and cost",
164
- ),
120
+ ModelInfo(name="gpt-4o", display_name="GPT-4o"),
121
+ ModelInfo(name="gpt-4o-mini", display_name="GPT-4o-mini"),
122
+ ModelInfo(name="o1-preview", display_name="o1-preview"),
165
123
  ]
166
124
 
167
125
  @staticmethod
168
126
  async def fetch_gemini_models(api_key: str) -> List[ModelInfo]:
169
- """Fetch available models from Google Gemini API."""
170
127
  try:
171
128
  async with httpx.AsyncClient() as client:
172
129
  response = await client.get(
@@ -176,106 +133,33 @@ class ModelDiscovery:
176
133
  if response.status_code == 200:
177
134
  data = response.json()
178
135
  models = []
179
- # Filter to generative models
180
136
  for model in data.get("models", []):
181
- model_name = model.get("name", "").replace("models/", "")
182
- if "gemini" in model_name.lower():
183
- models.append(
184
- ModelInfo(
185
- name=model_name,
186
- display_name=model_name,
187
- description=f"Google Gemini - {model.get('displayName', 'N/A')}",
188
- )
189
- )
190
- return (
191
- models
192
- if models
193
- else await ModelDiscovery._get_gemini_fallback()
194
- )
195
- else:
196
- logger.warning(
197
- f"Gemini API returned {response.status_code}, using fallback models"
198
- )
199
- return await ModelDiscovery._get_gemini_fallback()
200
- except Exception as e:
201
- logger.warning(f"Failed to fetch Gemini models: {e}, using fallback")
137
+ name = model.get("name", "").replace("models/", "")
138
+ if "gemini" in name.lower():
139
+ models.append(ModelInfo(name=name, display_name=name))
140
+ return models if models else await ModelDiscovery._get_gemini_fallback()
141
+ return await ModelDiscovery._get_gemini_fallback()
142
+ except Exception:
202
143
  return await ModelDiscovery._get_gemini_fallback()
203
144
 
204
145
  @staticmethod
205
146
  async def _get_gemini_fallback() -> List[ModelInfo]:
206
- """Fallback models for Gemini when API unavailable."""
207
147
  return [
208
- ModelInfo(
209
- name="gemini-3.1-pro",
210
- display_name="Gemini 3.1 Pro (Latest SOTA Reasoning)",
211
- max_tokens=200000,
212
- description="Latest SOTA reasoning model with unprecedented depth and nuance. $2 input, $12 output per context window",
213
- ),
214
- ModelInfo(
215
- name="gemini-3-flash",
216
- display_name="Gemini 3 Flash (Latest, Fastest)",
217
- max_tokens=200000,
218
- description="Most intelligent model built for speed, combining frontier intelligence with superior search and grounding",
219
- ),
220
- ModelInfo(
221
- name="gemini-3.1-flash-lite",
222
- display_name="Gemini 3.1 Flash Lite (Cheapest)",
223
- max_tokens=200000,
224
- description="Most cost-efficient model, optimized for high-volume agentic tasks. $0.25 input, $1.50 output",
225
- ),
226
- ModelInfo(
227
- name="gemini-2.0-flash",
228
- display_name="Gemini 2.0 Flash (Previous)",
229
- max_tokens=2000,
230
- description="Previous generation Gemini model",
231
- ),
148
+ ModelInfo(name="gemini-1.5-pro", display_name="Gemini 1.5 Pro"),
149
+ ModelInfo(name="gemini-1.5-flash", display_name="Gemini 1.5 Flash"),
232
150
  ]
233
151
 
234
152
  @staticmethod
235
153
  async def fetch_claude_models(api_key: str) -> List[ModelInfo]:
236
- """Fetch available models from Anthropic Claude API."""
237
- try:
238
- async with httpx.AsyncClient() as client:
239
- # Claude doesn't have a public models endpoint, use documented models
240
- # Make a test call to verify API key works
241
- response = await client.get(
242
- "https://api.anthropic.com/v1/models",
243
- headers={"x-api-key": api_key},
244
- timeout=10.0,
245
- )
246
- # If we get here, API key works - return known models
247
- return await ModelDiscovery._get_claude_fallback()
248
- except Exception as e:
249
- logger.warning(f"Failed to verify Claude API: {e}, returning known models")
250
- return await ModelDiscovery._get_claude_fallback()
251
-
252
- @staticmethod
253
- async def _get_claude_fallback() -> List[ModelInfo]:
254
- """Known Claude models (Anthropic doesn't provide list endpoint)."""
154
+ # Anthropic doesn't have a models endpoint, just return hardcoded
255
155
  return [
256
- ModelInfo(
257
- name="claude-opus-4.6",
258
- display_name="Claude Opus 4.6 (Most Intelligent)",
259
- max_tokens=200000,
260
- description="Most intelligent broadly available model for complex reasoning. $5 input, $25 output per 1M tokens",
261
- ),
262
- ModelInfo(
263
- name="claude-sonnet-4.6",
264
- display_name="Claude Sonnet 4.6 (Best Value)",
265
- max_tokens=200000,
266
- description="Best balance of speed and intelligence. $3 input, $15 output per 1M tokens",
267
- ),
268
- ModelInfo(
269
- name="claude-haiku-4.5",
270
- display_name="Claude Haiku 4.5 (Fastest, Cheapest)",
271
- max_tokens=200000,
272
- description="Fast and cost-efficient for simpler tasks. $0.80 input, $4 output per 1M tokens",
273
- ),
156
+ ModelInfo(name="claude-3-5-sonnet-20240620", display_name="Claude 3.5 Sonnet"),
157
+ ModelInfo(name="claude-3-opus-20240229", display_name="Claude 3 Opus"),
158
+ ModelInfo(name="claude-3-haiku-20240307", display_name="Claude 3 Haiku"),
274
159
  ]
275
160
 
276
161
  @staticmethod
277
162
  async def discover_all(provider: str, api_key: str) -> List[ModelInfo]:
278
- """Discover all models for a given provider."""
279
163
  provider = provider.lower().strip()
280
164
  if provider == "modal":
281
165
  return await ModelDiscovery.fetch_modal_models(api_key)
@@ -285,5 +169,28 @@ class ModelDiscovery:
285
169
  return await ModelDiscovery.fetch_gemini_models(api_key)
286
170
  elif provider == "claude":
287
171
  return await ModelDiscovery.fetch_claude_models(api_key)
172
+ elif provider == "deepseek":
173
+ return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.deepseek.com/v1", "DeepSeek")
174
+ elif provider == "kimi":
175
+ return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.moonshot.cn/v1", "Kimi")
176
+ elif provider == "minimax":
177
+ return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.minimax.chat/v1", "Minimax")
178
+ elif provider == "siliconflow":
179
+ return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.siliconflow.cn/v1", "SiliconFlow")
288
180
  else:
289
- raise ValueError(f"Unknown provider: {provider}")
181
+ return []
182
+
183
+ if __name__ == "__main__":
184
+ import sys
185
+ if len(sys.argv) < 3:
186
+ print(json.dumps([]))
187
+ sys.exit(0)
188
+
189
+ provider = sys.argv[1]
190
+ api_key = sys.argv[2]
191
+
192
+ async def main():
193
+ models = await ModelDiscovery.discover_all(provider, api_key)
194
+ print(json.dumps([asdict(m) for m in models]))
195
+
196
+ asyncio.run(main())