parishad 0.1.4__tar.gz → 0.1.5__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.
Files changed (76) hide show
  1. {parishad-0.1.4 → parishad-0.1.5}/CHANGELOG.md +5 -0
  2. {parishad-0.1.4 → parishad-0.1.5}/PKG-INFO +1 -1
  3. {parishad-0.1.4 → parishad-0.1.5}/pyproject.toml +1 -1
  4. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/__init__.py +1 -1
  5. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/cli/main.py +5 -0
  6. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/config/pipeline.core.yaml +1 -1
  7. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/config/pipeline.extended.yaml +1 -1
  8. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/config/pipeline.fast.yaml +1 -1
  9. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/data/models.json +1 -1
  10. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/orchestrator/config_loader.py +2 -2
  11. parishad-0.1.5/src/parishad/utils/installer.py +86 -0
  12. {parishad-0.1.4 → parishad-0.1.5}/.github/workflows/publish.yml +0 -0
  13. {parishad-0.1.4 → parishad-0.1.5}/.gitignore +0 -0
  14. {parishad-0.1.4 → parishad-0.1.5}/CODE_OF_CONDUCT.md +0 -0
  15. {parishad-0.1.4 → parishad-0.1.5}/CONTRIBUTING.md +0 -0
  16. {parishad-0.1.4 → parishad-0.1.5}/LICENSE +0 -0
  17. {parishad-0.1.4 → parishad-0.1.5}/README.md +0 -0
  18. {parishad-0.1.4 → parishad-0.1.5}/SECURITY.md +0 -0
  19. {parishad-0.1.4 → parishad-0.1.5}/docs/assets/logo.jpeg +0 -0
  20. {parishad-0.1.4 → parishad-0.1.5}/docs/assets/logo.svg +0 -0
  21. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/__main__.py +0 -0
  22. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/checker/__init__.py +0 -0
  23. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/checker/deterministic.py +0 -0
  24. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/checker/ensemble.py +0 -0
  25. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/checker/retrieval.py +0 -0
  26. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/cli/__init__.py +0 -0
  27. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/cli/code.py +0 -0
  28. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/cli/prarambh.py +0 -0
  29. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/cli/sthapana.py +0 -0
  30. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/config/modes.py +0 -0
  31. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/config/user_config.py +0 -0
  32. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/data/catalog.py +0 -0
  33. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/memory/__init__.py +0 -0
  34. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/__init__.py +0 -0
  35. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/__init__.py +0 -0
  36. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/base.py +0 -0
  37. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/huggingface.py +0 -0
  38. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/llama_cpp.py +0 -0
  39. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/mlx_lm.py +0 -0
  40. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/ollama.py +0 -0
  41. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/openai_api.py +0 -0
  42. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/backends/transformers_hf.py +0 -0
  43. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/costs.py +0 -0
  44. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/downloader.py +0 -0
  45. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/optimizations.py +0 -0
  46. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/profiles.py +0 -0
  47. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/reliability.py +0 -0
  48. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/runner.py +0 -0
  49. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/models/tokenization.py +0 -0
  50. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/orchestrator/__init__.py +0 -0
  51. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/orchestrator/engine.py +0 -0
  52. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/orchestrator/exceptions.py +0 -0
  53. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/__init__.py +0 -0
  54. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/base.py +0 -0
  55. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/dandadhyaksha.py +0 -0
  56. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/darbari.py +0 -0
  57. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/majumdar.py +0 -0
  58. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/pantapradhan.py +0 -0
  59. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/prerak.py +0 -0
  60. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/raja.py +0 -0
  61. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/sacheev.py +0 -0
  62. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/sainik.py +0 -0
  63. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/sar_senapati.py +0 -0
  64. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/roles/vidushak.py +0 -0
  65. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/tools/__init__.py +0 -0
  66. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/tools/base.py +0 -0
  67. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/tools/fs.py +0 -0
  68. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/tools/perception.py +0 -0
  69. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/tools/retrieval.py +0 -0
  70. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/tools/shell.py +0 -0
  71. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/utils/__init__.py +0 -0
  72. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/utils/hardware.py +0 -0
  73. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/utils/logging.py +0 -0
  74. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/utils/scanner.py +0 -0
  75. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/utils/text.py +0 -0
  76. {parishad-0.1.4 → parishad-0.1.5}/src/parishad/utils/tracing.py +0 -0
@@ -5,6 +5,11 @@ All notable changes to the **Parishad** project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.5] - 2026-01-26
9
+
10
+ ### Added
11
+ - **Runtime Auto-Installer**: Integrated automatic detection and installation of `llama-cpp-python` wheels on Windows/Mac/Linux. Running `parishad` now fixes missing backend dependencies automatically.
12
+
8
13
  ## [0.1.4] - 2026-01-26
9
14
 
10
15
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: parishad
3
- Version: 0.1.4
3
+ Version: 0.1.5
4
4
  Summary: A cost-aware, local-first council of heterogeneous LLMs for reliable reasoning, coding, and factual correctness
5
5
  Project-URL: Homepage, https://github.com/parishad-council/parishad
6
6
  Project-URL: Documentation, https://github.com/parishad-council/parishad#readme
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "parishad"
7
- version = "0.1.4"
7
+ version = "0.1.5"
8
8
  description = "A cost-aware, local-first council of heterogeneous LLMs for reliable reasoning, coding, and factual correctness"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -5,7 +5,7 @@ Parishad orchestrates multiple local language models into a structured "council"
5
5
  that achieves higher reliability than a single model under strict compute budgets.
6
6
  """
7
7
 
8
- __version__ = "0.1.4"
8
+ __version__ = "0.1.5"
9
9
 
10
10
  from .orchestrator.engine import Parishad, ParishadEngine, PipelineConfig
11
11
  from .models.runner import ModelRunner, ModelConfig
@@ -189,6 +189,11 @@ def cli(ctx):
189
189
  config - View or modify configuration
190
190
  sthapana - स्थापना (Setup) - Configure your Parishad Sabha
191
191
  """
192
+ if ctx.invoked_subcommand != "init":
193
+ # Check backend installation (skip for init/config commands if needed, but safer to just check)
194
+ from ..utils.installer import check_and_install_backend
195
+ check_and_install_backend()
196
+
192
197
  if ctx.invoked_subcommand is None:
193
198
  # First run - ask for permissions
194
199
  if is_first_run():
@@ -3,7 +3,7 @@
3
3
  # Uses 2 model slots: mid + big
4
4
 
5
5
  name: "parishad-core"
6
- version: "0.1.4"
6
+ version: "0.1.5"
7
7
  description: "Balanced 8-role pipeline: Madhya Sabha with extended council"
8
8
 
9
9
  # Role definitions
@@ -3,7 +3,7 @@
3
3
  # Uses 3 model slots: small + mid + big
4
4
 
5
5
  name: "parishad-extended"
6
- version: "0.1.4"
6
+ version: "0.1.5"
7
7
  description: "Maha Sabha: Full 10-role council including Lateral Thinker (Vidushak)"
8
8
 
9
9
  # Role definitions
@@ -3,7 +3,7 @@
3
3
  # Laghu Sabha matches standard structure but uses smaller/faster models
4
4
 
5
5
  name: "parishad-fast"
6
- version: "0.1.4"
6
+ version: "0.1.5"
7
7
  description: "Fast 5-role pipeline: Analyze -> Plan -> Execute -> Check -> Judge"
8
8
 
9
9
  # Role definitions
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.4",
2
+ "version": "0.1.5",
3
3
  "updated": "2024-12-30",
4
4
  "sources": {
5
5
  "ollama": {
@@ -21,7 +21,7 @@ class RoleSpec:
21
21
  name: str
22
22
  class_name: str
23
23
  slot: str
24
- version: str = "0.1.4"
24
+ version: str = "0.1.5"
25
25
  budget_tokens: int = 1000
26
26
  dependencies: list[str] = field(default_factory=list)
27
27
  max_tokens: Optional[int] = None
@@ -110,7 +110,7 @@ def load_pipeline_config(name: str, config_dir: Optional[Path] = None) -> list[R
110
110
  name=role_name.lower(), # Always store as lowercase for consistent lookups
111
111
  class_name=role_config.get("class", role_name.capitalize()),
112
112
  slot=role_config.get("slot", "mid"),
113
- version=role_config.get("version", "0.1.4"),
113
+ version=role_config.get("version", "0.1.5"),
114
114
  budget_tokens=role_config.get("budget_tokens", 1000),
115
115
  dependencies=role_config.get("dependencies", []),
116
116
  max_tokens=role_config.get("max_tokens"),
@@ -0,0 +1,86 @@
1
+
2
+ import subprocess
3
+ import sys
4
+ import platform
5
+ import os
6
+ import importlib.util
7
+ from rich.console import Console
8
+
9
+ console = Console()
10
+
11
+ def check_and_install_backend():
12
+ """
13
+ Check if llama-cpp-python is installed.
14
+ If not, automatically install it using pre-built wheels or optimal settings.
15
+ """
16
+ if importlib.util.find_spec("llama_cpp") is not None:
17
+ return
18
+
19
+ console.print("\n[bold yellow]⚠️ Core backend (llama-cpp-python) is missing.[/bold yellow]")
20
+ console.print("[dim]Parishad needs this to run local models.[/dim]")
21
+
22
+ system = platform.system()
23
+
24
+ # 1. Windows: The main pain point. Use pre-built wheels.
25
+ if system == "Windows":
26
+ console.print("\n[cyan]🪟 Windows detected. Scanning for NVIDIA GPU...[/cyan]")
27
+
28
+ use_cuda = False
29
+ try:
30
+ # Simple check for nvcc
31
+ subprocess.run(["nvcc", "--version"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
32
+ console.print("[green]✓ CUDA Toolkit detected (nvcc found).[/green]")
33
+ use_cuda = True
34
+ except (subprocess.CalledProcessError, FileNotFoundError):
35
+ console.print("[yellow]! CUDA not found. Defaulting to CPU.[/yellow]")
36
+ console.print("[dim](If you have an NVIDIA GPU, install CUDA Toolkit 12.x for 10x speed)[/dim]")
37
+
38
+ console.print(f"\n[bold green]🚀 Auto-installing optimized backend for {'CUDA 12.x' if use_cuda else 'CPU'}...[/bold green]")
39
+ console.print("[dim]This may take a minute...[/dim]\n")
40
+
41
+ cmd = [sys.executable, "-m", "pip", "install", "llama-cpp-python"]
42
+ cmd.extend(["--prefer-binary", "--extra-index-url"])
43
+
44
+ if use_cuda:
45
+ # Use cu124 wheels (compatible with most modern 12.x)
46
+ cmd.append("https://abetlen.github.io/llama-cpp-python/whl/cu124")
47
+ else:
48
+ cmd.append("https://abetlen.github.io/llama-cpp-python/whl/cpu")
49
+
50
+ try:
51
+ subprocess.check_call(cmd)
52
+ console.print("\n[bold green]✓ Backend installed successfully![/bold green]")
53
+ except subprocess.CalledProcessError:
54
+ console.print("\n[bold red]❌ Installation failed.[/bold red]")
55
+ console.print("Please copy-paste this command manually:")
56
+ console.print(f" {' '.join(cmd)}")
57
+ sys.exit(1)
58
+
59
+ # 2. Mac: Enable Metal
60
+ elif system == "Darwin":
61
+ console.print("\n[cyan]🍎 Mac detected. Installing with Metal (GPU) support...[/cyan]")
62
+
63
+ env = os.environ.copy()
64
+ env["CMAKE_ARGS"] = "-DGGML_METAL=on"
65
+
66
+ cmd = [sys.executable, "-m", "pip", "install", "llama-cpp-python"]
67
+
68
+ try:
69
+ subprocess.check_call(cmd, env=env)
70
+ console.print("\n[bold green]✓ Backend installed successfully![/bold green]")
71
+ except subprocess.CalledProcessError:
72
+ console.print("\n[bold red]❌ Installation failed.[/bold red]")
73
+ sys.exit(1)
74
+
75
+ # 3. Linux: Standard install
76
+ else:
77
+ console.print("\n[cyan]🐧 Linux detected. Installing from PyPI...[/cyan]")
78
+ cmd = [sys.executable, "-m", "pip", "install", "llama-cpp-python"]
79
+ try:
80
+ subprocess.check_call(cmd)
81
+ console.print("\n[bold green]✓ Backend installed successfully![/bold green]")
82
+ except subprocess.CalledProcessError:
83
+ sys.exit(1)
84
+
85
+ # clear some space
86
+ print()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes