praisonai-train 0.0.2__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.
- praisonai_train-0.0.2/PKG-INFO +132 -0
- praisonai_train-0.0.2/README.md +98 -0
- praisonai_train-0.0.2/praisonai_train/__init__.py +39 -0
- praisonai_train-0.0.2/praisonai_train/__main__.py +18 -0
- praisonai_train-0.0.2/praisonai_train/_bootstrap.py +37 -0
- praisonai_train-0.0.2/praisonai_train/_code_bridge.py +28 -0
- praisonai_train-0.0.2/praisonai_train/_version.py +1 -0
- praisonai_train-0.0.2/praisonai_train/_wrapper_bridge.py +31 -0
- praisonai_train-0.0.2/praisonai_train/cli/__init__.py +1 -0
- praisonai_train-0.0.2/praisonai_train/cli/app.py +15 -0
- praisonai_train-0.0.2/praisonai_train/cli/commands/__init__.py +1 -0
- praisonai_train-0.0.2/praisonai_train/cli/commands/train.py +626 -0
- praisonai_train-0.0.2/praisonai_train/cli/output/__init__.py +18 -0
- praisonai_train-0.0.2/praisonai_train/cli/output/console.py +149 -0
- praisonai_train-0.0.2/praisonai_train/setup/__init__.py +1 -0
- praisonai_train-0.0.2/praisonai_train/setup/config.yaml +60 -0
- praisonai_train-0.0.2/praisonai_train/setup/setup_conda_env.py +25 -0
- praisonai_train-0.0.2/praisonai_train/setup/setup_conda_env.sh +105 -0
- praisonai_train-0.0.2/praisonai_train/train/__init__.py +77 -0
- praisonai_train-0.0.2/praisonai_train/train/_ollama.py +97 -0
- praisonai_train-0.0.2/praisonai_train/train/agents/__init__.py +94 -0
- praisonai_train-0.0.2/praisonai_train/train/agents/grader.py +63 -0
- praisonai_train-0.0.2/praisonai_train/train/agents/hook.py +320 -0
- praisonai_train-0.0.2/praisonai_train/train/agents/models.py +328 -0
- praisonai_train-0.0.2/praisonai_train/train/agents/orchestrator.py +394 -0
- praisonai_train-0.0.2/praisonai_train/train/agents/storage.py +282 -0
- praisonai_train-0.0.2/praisonai_train/train/llm/__init__.py +23 -0
- praisonai_train-0.0.2/praisonai_train/train/llm/trainer.py +587 -0
- praisonai_train-0.0.2/praisonai_train/train_vision.py +333 -0
- praisonai_train-0.0.2/praisonai_train/upload_vision.py +141 -0
- praisonai_train-0.0.2/praisonai_train.egg-info/PKG-INFO +132 -0
- praisonai_train-0.0.2/praisonai_train.egg-info/SOURCES.txt +36 -0
- praisonai_train-0.0.2/praisonai_train.egg-info/dependency_links.txt +1 -0
- praisonai_train-0.0.2/praisonai_train.egg-info/entry_points.txt +3 -0
- praisonai_train-0.0.2/praisonai_train.egg-info/requires.txt +26 -0
- praisonai_train-0.0.2/praisonai_train.egg-info/top_level.txt +1 -0
- praisonai_train-0.0.2/pyproject.toml +67 -0
- praisonai_train-0.0.2/setup.cfg +4 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: praisonai-train
|
|
3
|
+
Version: 0.0.2
|
|
4
|
+
Summary: Training for PraisonAI — LLM fine-tuning (Unsloth) and iterative agent training extracted from the praisonai wrapper.
|
|
5
|
+
Author: Mervin Praison
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://docs.praison.ai
|
|
8
|
+
Project-URL: Repository, https://github.com/mervinpraison/PraisonAI
|
|
9
|
+
Requires-Python: <3.15,>=3.10
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
Requires-Dist: praisonaiagents>=1.6.126
|
|
12
|
+
Requires-Dist: rich>=13.7
|
|
13
|
+
Requires-Dist: typer>=0.12.0
|
|
14
|
+
Requires-Dist: click>=8.4.2
|
|
15
|
+
Requires-Dist: PyYAML>=6.0
|
|
16
|
+
Provides-Extra: llm
|
|
17
|
+
Requires-Dist: praisonai-code>=0.0.1; extra == "llm"
|
|
18
|
+
Requires-Dist: torch>=2.3.0; extra == "llm"
|
|
19
|
+
Requires-Dist: transformers>=4.40.0; extra == "llm"
|
|
20
|
+
Requires-Dist: unsloth>=2024.8; extra == "llm"
|
|
21
|
+
Requires-Dist: trl<0.9.0; extra == "llm"
|
|
22
|
+
Requires-Dist: peft>=0.10.0; extra == "llm"
|
|
23
|
+
Requires-Dist: accelerate>=0.30.0; extra == "llm"
|
|
24
|
+
Requires-Dist: bitsandbytes>=0.43.0; extra == "llm"
|
|
25
|
+
Requires-Dist: datasets>=2.19.0; extra == "llm"
|
|
26
|
+
Requires-Dist: sentencepiece>=0.2.0; extra == "llm"
|
|
27
|
+
Requires-Dist: protobuf; extra == "llm"
|
|
28
|
+
Requires-Dist: huggingface_hub>=0.23.0; extra == "llm"
|
|
29
|
+
Requires-Dist: hf_transfer; extra == "llm"
|
|
30
|
+
Provides-Extra: vision
|
|
31
|
+
Requires-Dist: praisonai-train[llm]; extra == "vision"
|
|
32
|
+
Provides-Extra: all
|
|
33
|
+
Requires-Dist: praisonai-train[llm]; extra == "all"
|
|
34
|
+
|
|
35
|
+
# PraisonAI Train
|
|
36
|
+
|
|
37
|
+
Training for [PraisonAI](https://github.com/mervinpraison/PraisonAI) — fine-tune LLMs and iteratively train agents, as a standalone package or as part of the full `praisonai` stack.
|
|
38
|
+
|
|
39
|
+
## What it does
|
|
40
|
+
|
|
41
|
+
| Command | What happens | Needs GPU/ML deps? |
|
|
42
|
+
|---------|--------------|--------------------|
|
|
43
|
+
| `praisonai-train agents --input "What is Python?"` | Runs your agent, grades the answer with an LLM judge, feeds suggestions back, repeats | No |
|
|
44
|
+
| `praisonai-train agents --input "Explain AI" --human` | Same loop, but **you** give the feedback | No |
|
|
45
|
+
| `praisonai-train llm dataset.json` | Fine-tunes an open model (Llama, Qwen, …) on your dataset with [Unsloth](https://github.com/unslothai/unsloth) | Yes |
|
|
46
|
+
| `praisonai-train list` / `show` / `apply` | Browse training sessions and apply the best iteration to an agent | No |
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Agent training only (lightweight)
|
|
52
|
+
pip install praisonai-train
|
|
53
|
+
|
|
54
|
+
# + LLM fine-tuning (heavy ML stack: torch, unsloth, trl, ...)
|
|
55
|
+
pip install "praisonai-train[llm]"
|
|
56
|
+
|
|
57
|
+
# Or as part of the full PraisonAI stack (same commands via `praisonai train ...`)
|
|
58
|
+
pip install "praisonai[train]"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
GPU setups often prefer the conda installer, which pins CUDA-compatible versions:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
setup-conda-env # or: bash praisonai_train/setup/setup_conda_env.sh
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Quickstart: train an agent in 2 minutes
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
export OPENAI_API_KEY=sk-...
|
|
71
|
+
|
|
72
|
+
# One input, three improvement iterations, LLM-as-judge
|
|
73
|
+
praisonai-train agents --input "What is the capital of France?" --iterations 3
|
|
74
|
+
|
|
75
|
+
# See what happened
|
|
76
|
+
praisonai-train list
|
|
77
|
+
praisonai-train show <session-id>
|
|
78
|
+
|
|
79
|
+
# Apply the best iteration and chat with the improved agent
|
|
80
|
+
praisonai-train apply <session-id> --run "And what about Germany?"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Python API:
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from praisonaiagents import Agent
|
|
87
|
+
from praisonai_train import AgentTrainer, TrainingScenario
|
|
88
|
+
|
|
89
|
+
agent = Agent(instructions="You are a helpful assistant.")
|
|
90
|
+
trainer = AgentTrainer(agent=agent, iterations=3)
|
|
91
|
+
trainer.add_scenario(TrainingScenario(id="demo", input_text="What is Python?"))
|
|
92
|
+
report = trainer.run()
|
|
93
|
+
report.print_summary()
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Quickstart: fine-tune an LLM
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pip install "praisonai-train[llm]"
|
|
100
|
+
|
|
101
|
+
# dataset.json in ShareGPT or Alpaca format; config.yaml is generated if absent
|
|
102
|
+
praisonai-train llm dataset.json --model llama-3.1
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Tuning knobs (LoRA rank, epochs, quantization, Ollama/HuggingFace export) live in `config.yaml` — see the template in `praisonai_train/setup/config.yaml`.
|
|
106
|
+
|
|
107
|
+
## How it fits the PraisonAI stack
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
praisonaiagents (core SDK)
|
|
111
|
+
├── praisonai-code (terminal CLI)
|
|
112
|
+
├── praisonai-bot (bots & gateway)
|
|
113
|
+
└── praisonai-train (this package)
|
|
114
|
+
└── praisonai (wrapper: installs everything)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- Depends only on `praisonaiagents` — no circular deps, installs standalone.
|
|
118
|
+
- With the full stack installed, the same commands are available as `praisonai train ...`.
|
|
119
|
+
- Old import paths (`praisonai.train.agents`, `python -m praisonai.train.llm.trainer`) keep working via wrapper shims.
|
|
120
|
+
|
|
121
|
+
## Development
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# From the monorepo root
|
|
125
|
+
cd src/praisonai-train
|
|
126
|
+
PYTHONPATH="../praisonai-agents:." python -m pytest tests/unit/train -q
|
|
127
|
+
|
|
128
|
+
# Import-direction gate (train must not import the wrapper)
|
|
129
|
+
bash ../../scripts/check_c10_train_imports.sh
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Boundary details: `src/praisonai/tests/PRAISONAI_TRAIN_MANIFEST.md`.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# PraisonAI Train
|
|
2
|
+
|
|
3
|
+
Training for [PraisonAI](https://github.com/mervinpraison/PraisonAI) — fine-tune LLMs and iteratively train agents, as a standalone package or as part of the full `praisonai` stack.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
| Command | What happens | Needs GPU/ML deps? |
|
|
8
|
+
|---------|--------------|--------------------|
|
|
9
|
+
| `praisonai-train agents --input "What is Python?"` | Runs your agent, grades the answer with an LLM judge, feeds suggestions back, repeats | No |
|
|
10
|
+
| `praisonai-train agents --input "Explain AI" --human` | Same loop, but **you** give the feedback | No |
|
|
11
|
+
| `praisonai-train llm dataset.json` | Fine-tunes an open model (Llama, Qwen, …) on your dataset with [Unsloth](https://github.com/unslothai/unsloth) | Yes |
|
|
12
|
+
| `praisonai-train list` / `show` / `apply` | Browse training sessions and apply the best iteration to an agent | No |
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Agent training only (lightweight)
|
|
18
|
+
pip install praisonai-train
|
|
19
|
+
|
|
20
|
+
# + LLM fine-tuning (heavy ML stack: torch, unsloth, trl, ...)
|
|
21
|
+
pip install "praisonai-train[llm]"
|
|
22
|
+
|
|
23
|
+
# Or as part of the full PraisonAI stack (same commands via `praisonai train ...`)
|
|
24
|
+
pip install "praisonai[train]"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
GPU setups often prefer the conda installer, which pins CUDA-compatible versions:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
setup-conda-env # or: bash praisonai_train/setup/setup_conda_env.sh
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Quickstart: train an agent in 2 minutes
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
export OPENAI_API_KEY=sk-...
|
|
37
|
+
|
|
38
|
+
# One input, three improvement iterations, LLM-as-judge
|
|
39
|
+
praisonai-train agents --input "What is the capital of France?" --iterations 3
|
|
40
|
+
|
|
41
|
+
# See what happened
|
|
42
|
+
praisonai-train list
|
|
43
|
+
praisonai-train show <session-id>
|
|
44
|
+
|
|
45
|
+
# Apply the best iteration and chat with the improved agent
|
|
46
|
+
praisonai-train apply <session-id> --run "And what about Germany?"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Python API:
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from praisonaiagents import Agent
|
|
53
|
+
from praisonai_train import AgentTrainer, TrainingScenario
|
|
54
|
+
|
|
55
|
+
agent = Agent(instructions="You are a helpful assistant.")
|
|
56
|
+
trainer = AgentTrainer(agent=agent, iterations=3)
|
|
57
|
+
trainer.add_scenario(TrainingScenario(id="demo", input_text="What is Python?"))
|
|
58
|
+
report = trainer.run()
|
|
59
|
+
report.print_summary()
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Quickstart: fine-tune an LLM
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pip install "praisonai-train[llm]"
|
|
66
|
+
|
|
67
|
+
# dataset.json in ShareGPT or Alpaca format; config.yaml is generated if absent
|
|
68
|
+
praisonai-train llm dataset.json --model llama-3.1
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Tuning knobs (LoRA rank, epochs, quantization, Ollama/HuggingFace export) live in `config.yaml` — see the template in `praisonai_train/setup/config.yaml`.
|
|
72
|
+
|
|
73
|
+
## How it fits the PraisonAI stack
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
praisonaiagents (core SDK)
|
|
77
|
+
├── praisonai-code (terminal CLI)
|
|
78
|
+
├── praisonai-bot (bots & gateway)
|
|
79
|
+
└── praisonai-train (this package)
|
|
80
|
+
└── praisonai (wrapper: installs everything)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- Depends only on `praisonaiagents` — no circular deps, installs standalone.
|
|
84
|
+
- With the full stack installed, the same commands are available as `praisonai train ...`.
|
|
85
|
+
- Old import paths (`praisonai.train.agents`, `python -m praisonai.train.llm.trainer`) keep working via wrapper shims.
|
|
86
|
+
|
|
87
|
+
## Development
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# From the monorepo root
|
|
91
|
+
cd src/praisonai-train
|
|
92
|
+
PYTHONPATH="../praisonai-agents:." python -m pytest tests/unit/train -q
|
|
93
|
+
|
|
94
|
+
# Import-direction gate (train must not import the wrapper)
|
|
95
|
+
bash ../../scripts/check_c10_train_imports.sh
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Boundary details: `src/praisonai/tests/PRAISONAI_TRAIN_MANIFEST.md`.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""PraisonAI Train — LLM fine-tuning and agent training (Tier 2c).
|
|
2
|
+
|
|
3
|
+
Extracted from the ``praisonai`` wrapper (C10). Two training modes:
|
|
4
|
+
|
|
5
|
+
- **LLM fine-tuning** (``praisonai-train llm``): Unsloth-based fine-tuning of
|
|
6
|
+
open models, driven by a ``config.yaml``. Heavy ML deps are lazy — install
|
|
7
|
+
with ``pip install "praisonai-train[llm]"`` or the conda script in
|
|
8
|
+
``praisonai_train/setup/``.
|
|
9
|
+
- **Agent training** (``praisonai-train agents``): iterative LLM-as-judge or
|
|
10
|
+
human-in-the-loop feedback loops. Needs only ``praisonaiagents``.
|
|
11
|
+
|
|
12
|
+
Old wrapper import paths (``praisonai.train.*``) keep working via shims.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from praisonai_train._version import __version__
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"__version__",
|
|
21
|
+
"AgentTrainer",
|
|
22
|
+
"TrainingScenario",
|
|
23
|
+
"TrainModel",
|
|
24
|
+
"apply_training",
|
|
25
|
+
"get_training_profile",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def __getattr__(name: str):
|
|
30
|
+
"""Lazy top-level exports — never import ML deps at package import time."""
|
|
31
|
+
if name in ("AgentTrainer", "TrainingScenario", "apply_training", "get_training_profile"):
|
|
32
|
+
from praisonai_train.train import agents as _agents
|
|
33
|
+
|
|
34
|
+
return getattr(_agents, name)
|
|
35
|
+
if name == "TrainModel":
|
|
36
|
+
from praisonai_train.train.llm import trainer as _trainer
|
|
37
|
+
|
|
38
|
+
return _trainer.TrainModel
|
|
39
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Console entry: ``praisonai-train``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def main(argv: list[str] | None = None) -> None:
|
|
9
|
+
from praisonai_train.cli.app import app
|
|
10
|
+
|
|
11
|
+
args = argv if argv is not None else sys.argv[1:]
|
|
12
|
+
if not args:
|
|
13
|
+
args = ["--help"]
|
|
14
|
+
app(args=args, prog_name="praisonai-train")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if __name__ == "__main__":
|
|
18
|
+
main()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Monorepo bootstrap for ``praisonai_train`` and optional ``praisonai_code``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def ensure_praisonai_train() -> None:
|
|
10
|
+
"""Ensure ``praisonai_train`` is importable in monorepo dev layouts."""
|
|
11
|
+
try:
|
|
12
|
+
import praisonai_train # noqa: F401
|
|
13
|
+
return
|
|
14
|
+
except ImportError:
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
here = Path(__file__).resolve().parents[1] # .../src/praisonai-train
|
|
18
|
+
if (here / "praisonai_train").is_dir():
|
|
19
|
+
root = str(here)
|
|
20
|
+
if root not in sys.path:
|
|
21
|
+
sys.path.insert(0, root)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def ensure_praisonai_code() -> None:
|
|
25
|
+
"""Optional code-tier imports (YAML agent loading, legacy dispatch) when co-installed."""
|
|
26
|
+
try:
|
|
27
|
+
import praisonai_code # noqa: F401
|
|
28
|
+
return
|
|
29
|
+
except ImportError:
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
train_src = Path(__file__).resolve().parents[1]
|
|
33
|
+
code_src = train_src.parent / "praisonai-code"
|
|
34
|
+
if (code_src / "praisonai_code").is_dir():
|
|
35
|
+
root = str(code_src)
|
|
36
|
+
if root not in sys.path:
|
|
37
|
+
sys.path.insert(0, root)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Lazy access from praisonai-train to optional praisonai-code modules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from praisonai_train._bootstrap import ensure_praisonai_code
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def code_available() -> bool:
|
|
12
|
+
ensure_praisonai_code()
|
|
13
|
+
try:
|
|
14
|
+
import praisonai_code # noqa: F401
|
|
15
|
+
return True
|
|
16
|
+
except ImportError:
|
|
17
|
+
return False
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def import_code_module(name: str) -> Any:
|
|
21
|
+
ensure_praisonai_code()
|
|
22
|
+
try:
|
|
23
|
+
return importlib.import_module(name)
|
|
24
|
+
except ImportError as exc:
|
|
25
|
+
raise ImportError(
|
|
26
|
+
f"Optional code module {name!r} requires praisonai-code. "
|
|
27
|
+
"Install with: pip install praisonai-code"
|
|
28
|
+
) from exc
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.0.2"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Lazy access from praisonai-train to optional praisonai wrapper modules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def wrapper_available() -> bool:
|
|
10
|
+
try:
|
|
11
|
+
import praisonai # noqa: F401
|
|
12
|
+
return True
|
|
13
|
+
except ImportError:
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def import_wrapper_module(name: str) -> Any:
|
|
18
|
+
if not wrapper_available():
|
|
19
|
+
raise ImportError(
|
|
20
|
+
f"Optional wrapper module {name!r} requires the praisonai package. "
|
|
21
|
+
"Install with: pip install praisonai"
|
|
22
|
+
)
|
|
23
|
+
return importlib.import_module(name)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def optional_wrapper_attr(module: str, attr: str, default: Any = None) -> Any:
|
|
27
|
+
try:
|
|
28
|
+
mod = import_wrapper_module(module)
|
|
29
|
+
return getattr(mod, attr)
|
|
30
|
+
except ImportError:
|
|
31
|
+
return default
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""CLI for standalone ``praisonai-train``."""
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Typer CLI for standalone ``praisonai-train``.
|
|
2
|
+
|
|
3
|
+
The train command group (``llm``, ``agents``, ``list``, ``show``, ``apply``)
|
|
4
|
+
is a single Typer app, so the standalone console script exposes it directly:
|
|
5
|
+
``praisonai-train llm dataset.json``, ``praisonai-train agents --input ...``.
|
|
6
|
+
|
|
7
|
+
Inside the full stack the same app is mounted as ``praisonai train`` via the
|
|
8
|
+
``_TRAIN_RESIDENT_COMMANDS`` routing in ``praisonai_code.cli.app``.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from praisonai_train.cli.commands.train import app
|
|
14
|
+
|
|
15
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Typer command modules for praisonai-train."""
|