sky-dev 0.0.6__tar.gz → 0.0.7__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.
- {sky_dev-0.0.6 → sky_dev-0.0.7}/CHANGELOG.md +17 -9
- {sky_dev-0.0.6 → sky_dev-0.0.7}/PKG-INFO +4 -7
- {sky_dev-0.0.6 → sky_dev-0.0.7}/README.md +3 -6
- {sky_dev-0.0.6 → sky_dev-0.0.7}/pyproject.toml +1 -1
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/__init__.py +1 -1
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/cli.py +46 -16
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/chat.py +5 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/fast_loop.py +6 -6
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/PKG-INFO +4 -7
- {sky_dev-0.0.6 → sky_dev-0.0.7}/.env.example +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/CONTRIBUTING.md +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/LICENSE +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/MANIFEST.in +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/SECURITY.md +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/setup.cfg +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/config/__init__.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/config/models.yaml +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/config/schema.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/__init__.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/approval.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/benchmark.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/mode_prompts.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/router.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/subagent.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/workflow.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/errors.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/memory/__init__.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/memory/indexer.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/memory/vectorstore.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/__init__.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/audit.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/detection.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/guardrails.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/prompts.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/rate_limit.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/sanitize.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/storage/__init__.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/storage/db.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/__init__.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/fs_tools.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/git_tools.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/registry.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/search_tools.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/shell_tools.py +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/SOURCES.txt +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/dependency_links.txt +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/entry_points.txt +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/requires.txt +0 -0
- {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/top_level.txt +0 -0
|
@@ -2,17 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Sky will be documented in this file.
|
|
4
4
|
|
|
5
|
-
## [0.0.
|
|
6
|
-
|
|
7
|
-
### Added
|
|
8
|
-
- Comprehensive test suite for core functionality.
|
|
9
|
-
- Automated test environment setup script (`setup_test_env.ps1`).
|
|
5
|
+
## [0.0.7] - 2026-09-01
|
|
10
6
|
|
|
11
7
|
### Fixed
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
8
|
+
- `sky init` now creates .env file with API keys
|
|
9
|
+
- Missing `Tuple` import in fast_loop.py (NameError fixed)
|
|
10
|
+
- Infinite tool validation loop (circuit breaker added)
|
|
11
|
+
- `install.py` now properly suppresses pip output
|
|
12
|
+
- `sky ask` no longer crashes on fresh install
|
|
13
|
+
- Fixed context length limits triggering 400 Invalid Request errors from the Groq API
|
|
14
|
+
- Re-implemented recursive truncation retry in model router for oversized context
|
|
15
|
+
- Fixed UnicodeEncodeError crashing CLI during pytest reporting on Windows
|
|
16
|
+
- Missing imports in semantic context search
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- `sky clean` command to remove all config files
|
|
20
|
+
- `sky reset` alias for `sky clean`
|
|
21
|
+
- API key validation in `sky init`
|
|
22
|
+
- Comprehensive test suite for core functionality
|
|
23
|
+
- Automated test environment setup script (`setup_test_env.ps1`)
|
|
16
24
|
|
|
17
25
|
## [0.0.5] - 2026-08-27
|
|
18
26
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sky-dev
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7
|
|
4
4
|
Summary: Sky - Agentic coding assistant. Build without boundaries.
|
|
5
5
|
Author-email: Aaditya A <aaditya@corover.ai>
|
|
6
6
|
License: MIT
|
|
@@ -60,20 +60,17 @@ Sky is a local, CLI-based, agentic software development assistant that helps you
|
|
|
60
60
|
|
|
61
61
|
## Installation
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
### Option 1: Quick Install (Standard)
|
|
63
|
+
### Quick Install
|
|
66
64
|
```bash
|
|
67
65
|
pip install sky-dev
|
|
68
66
|
```
|
|
69
67
|
|
|
70
|
-
###
|
|
68
|
+
### Clean Install (Recommended)
|
|
71
69
|
```bash
|
|
72
70
|
pip install sky-dev --quiet
|
|
73
71
|
```
|
|
74
72
|
|
|
75
|
-
###
|
|
76
|
-
If you have downloaded the repository, you can run:
|
|
73
|
+
### Branded Install
|
|
77
74
|
```bash
|
|
78
75
|
python install.py
|
|
79
76
|
```
|
|
@@ -11,20 +11,17 @@ Sky is a local, CLI-based, agentic software development assistant that helps you
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
### Option 1: Quick Install (Standard)
|
|
14
|
+
### Quick Install
|
|
17
15
|
```bash
|
|
18
16
|
pip install sky-dev
|
|
19
17
|
```
|
|
20
18
|
|
|
21
|
-
###
|
|
19
|
+
### Clean Install (Recommended)
|
|
22
20
|
```bash
|
|
23
21
|
pip install sky-dev --quiet
|
|
24
22
|
```
|
|
25
23
|
|
|
26
|
-
###
|
|
27
|
-
If you have downloaded the repository, you can run:
|
|
24
|
+
### Branded Install
|
|
28
25
|
```bash
|
|
29
26
|
python install.py
|
|
30
27
|
```
|
|
@@ -32,6 +32,15 @@ def version_callback(value: bool) -> None:
|
|
|
32
32
|
console.print(f"SKY CLI Version: {__version__}")
|
|
33
33
|
raise typer.Exit()
|
|
34
34
|
|
|
35
|
+
def _handle_error(e):
|
|
36
|
+
if "GROQ_API_KEY" in str(e):
|
|
37
|
+
return "🔑 Missing GROQ_API_KEY. Run 'sky init'."
|
|
38
|
+
if "NVIDIA_NIM_API_KEY" in str(e):
|
|
39
|
+
return "🔑 Missing NVIDIA_NIM_API_KEY. Run 'sky init'."
|
|
40
|
+
if "models.yaml" in str(e):
|
|
41
|
+
return "⚠️ Configuration error. Run 'sky init --force'."
|
|
42
|
+
return f"Error: {e}"
|
|
43
|
+
|
|
35
44
|
|
|
36
45
|
@app.callback()
|
|
37
46
|
def main(
|
|
@@ -655,20 +664,19 @@ def init(
|
|
|
655
664
|
nim_key = typer.prompt("Enter your NVIDIA NIM API Key (or press Enter to skip)", default="", show_default=False)
|
|
656
665
|
groq_key = typer.prompt("Enter your GROQ API Key (or press Enter to skip)", default="", show_default=False)
|
|
657
666
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
env_content = env_path.read_text()
|
|
662
|
-
|
|
663
|
-
if nim_key and "NIM_API_KEY" not in env_content:
|
|
664
|
-
with open(env_path, "a") as f:
|
|
665
|
-
f.write(f"\nNIM_API_KEY={nim_key}\n")
|
|
666
|
-
console.print("[green]Added NIM_API_KEY to .env[/green]")
|
|
667
|
+
if groq_key and not groq_key.startswith("gsk_"):
|
|
668
|
+
console.print("[red]⚠️ Groq API key should start with 'gsk_'[/red]")
|
|
669
|
+
groq_key = Prompt.ask("Re-enter Groq API key")
|
|
667
670
|
|
|
668
|
-
|
|
669
|
-
with open(
|
|
670
|
-
|
|
671
|
-
|
|
671
|
+
def _save_env(groq_key: str, nim_key: str):
|
|
672
|
+
with open(".env", "w") as f:
|
|
673
|
+
if groq_key:
|
|
674
|
+
f.write(f"GROQ_API_KEY={groq_key}\n")
|
|
675
|
+
if nim_key:
|
|
676
|
+
f.write(f"NVIDIA_NIM_API_KEY={nim_key}\n")
|
|
677
|
+
console.print("[green]✅ API keys saved to .env[/green]")
|
|
678
|
+
|
|
679
|
+
_save_env(groq_key, nim_key)
|
|
672
680
|
|
|
673
681
|
# 2. Generate local models.yaml
|
|
674
682
|
models_yaml_path = Path("models.yaml")
|
|
@@ -875,7 +883,8 @@ def check_providers():
|
|
|
875
883
|
)
|
|
876
884
|
else:
|
|
877
885
|
try:
|
|
878
|
-
|
|
886
|
+
nim_provider = models_config.providers.get("nim")
|
|
887
|
+
nim_base = nim_provider.base_url if (nim_provider and nim_provider.base_url) else "https://integrate.api.nvidia.com/v1"
|
|
879
888
|
res = httpx.get(f"{nim_base.rstrip('/')}/models", headers={"Authorization": f"Bearer {nim_key}"})
|
|
880
889
|
if res.status_code == 200:
|
|
881
890
|
print_provider_info("nim", "✅ [green]Connected[/green]")
|
|
@@ -897,7 +906,8 @@ def check_providers():
|
|
|
897
906
|
)
|
|
898
907
|
else:
|
|
899
908
|
try:
|
|
900
|
-
|
|
909
|
+
groq_provider = models_config.providers.get("groq")
|
|
910
|
+
groq_base = groq_provider.base_url if (groq_provider and groq_provider.base_url) else "https://api.groq.com/openai/v1"
|
|
901
911
|
res = httpx.get(f"{groq_base.rstrip('/')}/models", headers={"Authorization": f"Bearer {groq_key}"})
|
|
902
912
|
if res.status_code == 200:
|
|
903
913
|
print_provider_info("groq", "✅ [green]Connected[/green]")
|
|
@@ -919,5 +929,25 @@ def check_providers():
|
|
|
919
929
|
import sys
|
|
920
930
|
sys.exit(1)
|
|
921
931
|
|
|
932
|
+
@app.command("clean")
|
|
933
|
+
def clean():
|
|
934
|
+
"""Remove all Sky configuration files."""
|
|
935
|
+
from rich.prompt import Confirm
|
|
936
|
+
import shutil
|
|
937
|
+
if Confirm.ask("Delete all Sky configuration files (.env, models.yaml, .sky/)?", default=False):
|
|
938
|
+
for f in [".env", "models.yaml", ".sky/"]:
|
|
939
|
+
if Path(f).exists():
|
|
940
|
+
shutil.rmtree(f) if Path(f).is_dir() else Path(f).unlink()
|
|
941
|
+
console.print("[green]✅ Sky configuration cleaned.[/green]")
|
|
942
|
+
|
|
943
|
+
@app.command("reset")
|
|
944
|
+
def reset():
|
|
945
|
+
"""Reset Sky configuration (same as sky clean)."""
|
|
946
|
+
clean()
|
|
947
|
+
|
|
922
948
|
if __name__ == "__main__":
|
|
923
|
-
|
|
949
|
+
try:
|
|
950
|
+
app()
|
|
951
|
+
except Exception as e:
|
|
952
|
+
console.print(f"[bold red]{_handle_error(e)}[/bold red]")
|
|
953
|
+
sys.exit(1)
|
|
@@ -66,6 +66,11 @@ class ChatEngine:
|
|
|
66
66
|
|
|
67
67
|
def run(self, initial_prompt: Optional[str] = None):
|
|
68
68
|
"""Run the chat loop."""
|
|
69
|
+
import os
|
|
70
|
+
if not os.getenv("GROQ_API_KEY") and not os.getenv("NVIDIA_NIM_API_KEY"):
|
|
71
|
+
self.console.print("[yellow]⚠️ No API keys found. Run 'sky init' first.[/yellow]")
|
|
72
|
+
return
|
|
73
|
+
|
|
69
74
|
self.console.print(Panel(
|
|
70
75
|
Markdown(self.get_welcome_message()),
|
|
71
76
|
title="☁️ Sky Chat",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
|
-
from typing import Any, AsyncIterator, Dict, List, Optional
|
|
5
|
+
from typing import Any, AsyncIterator, Dict, List, Optional, Tuple
|
|
6
6
|
|
|
7
7
|
from sky.config import DexProjectConfig
|
|
8
8
|
from sky.core.approval import ApprovalGate
|
|
@@ -121,7 +121,7 @@ class FastLoopEngine:
|
|
|
121
121
|
"content": result_str,
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
def _validate_tool_calls(self, tool_calls: List[Dict[str, Any]]) ->
|
|
124
|
+
def _validate_tool_calls(self, tool_calls: List[Dict[str, Any]]) -> tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
|
|
125
125
|
"""Validate that tool calls are well-formed JSON. Returns (valid_calls, error_results)."""
|
|
126
126
|
valid_calls = []
|
|
127
127
|
error_results = []
|
|
@@ -215,7 +215,7 @@ class FastLoopEngine:
|
|
|
215
215
|
if not context:
|
|
216
216
|
return ""
|
|
217
217
|
|
|
218
|
-
return context
|
|
218
|
+
return str(context)
|
|
219
219
|
MAX_MESSAGES = 10
|
|
220
220
|
MAX_MESSAGE_LENGTH = 2000
|
|
221
221
|
|
|
@@ -313,9 +313,9 @@ class FastLoopEngine:
|
|
|
313
313
|
|
|
314
314
|
if "tool call validation failed" in error_str or "invalid_request_error" in error_str or "400" in error_str:
|
|
315
315
|
consecutive_tool_failures += 1
|
|
316
|
-
if consecutive_tool_failures
|
|
317
|
-
yield {"type": "error", "
|
|
318
|
-
|
|
316
|
+
if consecutive_tool_failures >= 2:
|
|
317
|
+
yield {"type": "error", "error": "Model stuck in tool validation loop. Aborting.", "suggestion": "Try rephrasing your request."}
|
|
318
|
+
return
|
|
319
319
|
|
|
320
320
|
from rich.console import Console
|
|
321
321
|
Console().print(f"[yellow]Model tool validation failed: {error_str}. Feeding error back to model...[/yellow]")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sky-dev
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7
|
|
4
4
|
Summary: Sky - Agentic coding assistant. Build without boundaries.
|
|
5
5
|
Author-email: Aaditya A <aaditya@corover.ai>
|
|
6
6
|
License: MIT
|
|
@@ -60,20 +60,17 @@ Sky is a local, CLI-based, agentic software development assistant that helps you
|
|
|
60
60
|
|
|
61
61
|
## Installation
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
### Option 1: Quick Install (Standard)
|
|
63
|
+
### Quick Install
|
|
66
64
|
```bash
|
|
67
65
|
pip install sky-dev
|
|
68
66
|
```
|
|
69
67
|
|
|
70
|
-
###
|
|
68
|
+
### Clean Install (Recommended)
|
|
71
69
|
```bash
|
|
72
70
|
pip install sky-dev --quiet
|
|
73
71
|
```
|
|
74
72
|
|
|
75
|
-
###
|
|
76
|
-
If you have downloaded the repository, you can run:
|
|
73
|
+
### Branded Install
|
|
77
74
|
```bash
|
|
78
75
|
python install.py
|
|
79
76
|
```
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|