yncli 1.1.9__tar.gz → 1.2.1__tar.gz
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.
- {yncli-1.1.9 → yncli-1.2.1}/PKG-INFO +1 -1
- {yncli-1.1.9 → yncli-1.2.1}/pyproject.toml +1 -1
- {yncli-1.1.9 → yncli-1.2.1}/setup.py +1 -1
- {yncli-1.1.9 → yncli-1.2.1}/yncli/client.py +18 -1
- {yncli-1.1.9 → yncli-1.2.1}/yncli/tui.py +35 -1
- yncli-1.2.1/yncli/version.py +1 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli.egg-info/PKG-INFO +1 -1
- yncli-1.1.9/yncli/version.py +0 -1
- {yncli-1.1.9 → yncli-1.2.1}/README.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/setup.cfg +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/__init__.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/agent.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/architect.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/code_review.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/debug_oracle.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/debugger.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/polyglot.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/refactor_master.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/security_auditor.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/system_architect.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/test_runner.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/built_in_skills/ultrabrain.md +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/clean_text.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/config.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/language_detector.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/main.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/mention_resolver.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/skills_manager.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/system_prompt.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/tools/__init__.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/tools/file_tools.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/tools/polyglot_tools.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/tools/search_tools.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/tools/system_tools.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/update_checker.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/workspace_memory.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli/workspace_scanner.py +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli.egg-info/SOURCES.txt +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli.egg-info/dependency_links.txt +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli.egg-info/entry_points.txt +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli.egg-info/requires.txt +0 -0
- {yncli-1.1.9 → yncli-1.2.1}/yncli.egg-info/top_level.txt +0 -0
|
@@ -6,7 +6,7 @@ long_description = (this_directory / "README.md").read_text(encoding="utf-8") if
|
|
|
6
6
|
|
|
7
7
|
setup(
|
|
8
8
|
name="yncli",
|
|
9
|
-
version="1.1
|
|
9
|
+
version="1.2.1",
|
|
10
10
|
description="Autonomous Polyglot AI Coding Agent & TUI",
|
|
11
11
|
long_description=long_description,
|
|
12
12
|
long_description_content_type="text/markdown",
|
|
@@ -17,8 +17,25 @@ class LLMClient:
|
|
|
17
17
|
|
|
18
18
|
def list_models(self) -> List[Dict[str, Any]]:
|
|
19
19
|
"""
|
|
20
|
-
Fetches the list of available models from the endpoint.
|
|
20
|
+
Fetches the list of available models from the endpoint (supports OpenAI, OpenRouter, Google Gemini).
|
|
21
21
|
"""
|
|
22
|
+
# Google Gemini models endpoint
|
|
23
|
+
if "generativelanguage.googleapis.com" in self.base_url:
|
|
24
|
+
url = f"https://generativelanguage.googleapis.com/v1beta/openai/models"
|
|
25
|
+
try:
|
|
26
|
+
resp = requests.get(url, headers={"Authorization": f"Bearer {self.api_key}"}, timeout=15)
|
|
27
|
+
if resp.status_code == 200:
|
|
28
|
+
data = resp.json()
|
|
29
|
+
models = []
|
|
30
|
+
for m in data.get("data", []):
|
|
31
|
+
mid = m.get("id", "").replace("models/", "")
|
|
32
|
+
# Filter to modern fast and coding models
|
|
33
|
+
if any(k in mid for k in ["flash", "pro", "gemma"]) and "embedding" not in mid and "tts" not in mid and "image" not in mid:
|
|
34
|
+
models.append({"id": mid})
|
|
35
|
+
return models
|
|
36
|
+
except Exception:
|
|
37
|
+
pass
|
|
38
|
+
|
|
22
39
|
url = f"{self.base_url}/models"
|
|
23
40
|
try:
|
|
24
41
|
resp = requests.get(url, headers={"Authorization": f"Bearer {self.api_key}"}, timeout=15)
|
|
@@ -179,7 +179,9 @@ class TerminalUI:
|
|
|
179
179
|
table.add_column("Keterangan", style="white")
|
|
180
180
|
|
|
181
181
|
table.add_row("/model, /models", "Buka popup interaktif untuk memilih model AI (klik mouse / panah)")
|
|
182
|
-
table.add_row("/
|
|
182
|
+
table.add_row("/google <api_key>", "Hubungkan langsung ke Google AI Studio Gemini API Key Anda!")
|
|
183
|
+
table.add_row("/key <api_key>", "Ganti API Key kustom Anda")
|
|
184
|
+
table.add_row("/endpoint <url>", "Ganti Endpoint API kustom (OpenAI, Ollama, OpenRouter, Groq, dll)")
|
|
183
185
|
table.add_row("/plan", "Masuk ke Plan Mode (Riset & susun PRD plan.md otomatis)")
|
|
184
186
|
table.add_row("/build", "Masuk ke Build Mode (Eksekusi autonomous pembuatan & editing kode)")
|
|
185
187
|
table.add_row("/ask", "Masuk ke Ask Mode (Konsultasi murni tanpa modifikasi file)")
|
|
@@ -312,6 +314,38 @@ class TerminalUI:
|
|
|
312
314
|
self.console.print(f"[green]Model berhasil diganti ke: [cyan]{new_model}[/cyan][/green]")
|
|
313
315
|
return True
|
|
314
316
|
|
|
317
|
+
elif cmd in ("/endpoint", "/baseurl"):
|
|
318
|
+
if not args:
|
|
319
|
+
self.console.print(f"Endpoint API saat ini: [cyan]{self.agent.client.base_url}[/cyan]")
|
|
320
|
+
self.console.print("Gunakan: [yellow]/endpoint <url_base_api>[/yellow] (contoh: https://api.openai.com/v1 atau http://localhost:11434/v1)")
|
|
321
|
+
return True
|
|
322
|
+
new_url = args[0].strip().rstrip("/")
|
|
323
|
+
self.agent.client.base_url = new_url
|
|
324
|
+
save_config({"base_url": new_url})
|
|
325
|
+
self.console.print(f"[green]Endpoint API berhasil diganti ke: [cyan]{new_url}[/cyan][/green]")
|
|
326
|
+
return True
|
|
327
|
+
|
|
328
|
+
elif cmd in ("/google", "/gemini"):
|
|
329
|
+
if not args:
|
|
330
|
+
self.console.print("Gunakan: [yellow]/google <google_api_key>[/yellow]")
|
|
331
|
+
self.console.print("Contoh: [cyan]/google AIzaSy...[/cyan] atau [cyan]/google AQ.Ab8...[/cyan]")
|
|
332
|
+
return True
|
|
333
|
+
g_key = args[0].strip()
|
|
334
|
+
g_endpoint = "https://generativelanguage.googleapis.com/v1beta/openai"
|
|
335
|
+
g_model = "gemini-3.6-flash"
|
|
336
|
+
self.agent.client.base_url = g_endpoint
|
|
337
|
+
self.agent.client.api_key = g_key
|
|
338
|
+
self.agent.set_model(g_model)
|
|
339
|
+
save_config({
|
|
340
|
+
"base_url": g_endpoint,
|
|
341
|
+
"api_key": g_key,
|
|
342
|
+
"model": g_model
|
|
343
|
+
})
|
|
344
|
+
self.console.print("[bold green]Berhasil terhubung ke Google Gemini AI Studio![/bold green]")
|
|
345
|
+
self.console.print(f"Endpoint: [cyan]{g_endpoint}[/cyan]")
|
|
346
|
+
self.console.print(f"Model aktif: [cyan]{g_model}[/cyan] (Ketik [yellow]/model[/yellow] untuk memilih model Gemini lainnya)")
|
|
347
|
+
return True
|
|
348
|
+
|
|
315
349
|
elif cmd == "/plan":
|
|
316
350
|
self.agent.set_mode("plan")
|
|
317
351
|
save_config({"mode": "plan"})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.2.1"
|
yncli-1.1.9/yncli/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.1.9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|