yncli 1.2.0__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.2.0 → yncli-1.2.1}/PKG-INFO +1 -1
- {yncli-1.2.0 → yncli-1.2.1}/pyproject.toml +1 -1
- {yncli-1.2.0 → yncli-1.2.1}/setup.py +1 -1
- {yncli-1.2.0 → yncli-1.2.1}/yncli/client.py +18 -1
- {yncli-1.2.0 → yncli-1.2.1}/yncli/tui.py +18 -9
- yncli-1.2.1/yncli/version.py +1 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli.egg-info/PKG-INFO +1 -1
- yncli-1.2.0/yncli/version.py +0 -1
- {yncli-1.2.0 → yncli-1.2.1}/README.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/setup.cfg +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/__init__.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/agent.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/architect.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/code_review.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/debug_oracle.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/debugger.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/polyglot.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/refactor_master.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/security_auditor.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/system_architect.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/test_runner.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/built_in_skills/ultrabrain.md +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/clean_text.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/config.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/language_detector.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/main.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/mention_resolver.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/skills_manager.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/system_prompt.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/tools/__init__.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/tools/file_tools.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/tools/polyglot_tools.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/tools/search_tools.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/tools/system_tools.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/update_checker.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/workspace_memory.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli/workspace_scanner.py +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli.egg-info/SOURCES.txt +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli.egg-info/dependency_links.txt +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli.egg-info/entry_points.txt +0 -0
- {yncli-1.2.0 → yncli-1.2.1}/yncli.egg-info/requires.txt +0 -0
- {yncli-1.2.0 → 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.2.
|
|
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,7 @@ 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
183
|
table.add_row("/key <api_key>", "Ganti API Key kustom Anda")
|
|
184
184
|
table.add_row("/endpoint <url>", "Ganti Endpoint API kustom (OpenAI, Ollama, OpenRouter, Groq, dll)")
|
|
185
185
|
table.add_row("/plan", "Masuk ke Plan Mode (Riset & susun PRD plan.md otomatis)")
|
|
@@ -325,16 +325,25 @@ class TerminalUI:
|
|
|
325
325
|
self.console.print(f"[green]Endpoint API berhasil diganti ke: [cyan]{new_url}[/cyan][/green]")
|
|
326
326
|
return True
|
|
327
327
|
|
|
328
|
-
elif cmd in ("/
|
|
328
|
+
elif cmd in ("/google", "/gemini"):
|
|
329
329
|
if not args:
|
|
330
|
-
|
|
331
|
-
self.console.print(
|
|
332
|
-
self.console.print("Gunakan: [yellow]/key <api_key_anda>[/yellow]")
|
|
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]")
|
|
333
332
|
return True
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
self.
|
|
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)")
|
|
338
347
|
return True
|
|
339
348
|
|
|
340
349
|
elif cmd == "/plan":
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.2.1"
|
yncli-1.2.0/yncli/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.2.0"
|
|
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
|