Skip to content

Commit ffc3775

Browse files
committed
Release v3.9.33
1 parent 86e76b7 commit ffc3775

File tree

12 files changed

+36
-20
lines changed

12 files changed

+36
-20
lines changed

docker/Dockerfile.chat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
1616
# Install Python packages (using latest versions)
1717
RUN pip install --no-cache-dir \
1818
praisonai_tools \
19-
"praisonai>=3.9.32" \
19+
"praisonai>=3.9.33" \
2020
"praisonai[chat]" \
2121
"embedchain[github,youtube]"
2222

docker/Dockerfile.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ RUN mkdir -p /root/.praison
2020
# Install Python packages (using latest versions)
2121
RUN pip install --no-cache-dir \
2222
praisonai_tools \
23-
"praisonai>=3.9.32" \
23+
"praisonai>=3.9.33" \
2424
"praisonai[ui]" \
2525
"praisonai[chat]" \
2626
"praisonai[realtime]" \

docker/Dockerfile.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison
1616
# Install Python packages (using latest versions)
1717
RUN pip install --no-cache-dir \
1818
praisonai_tools \
19-
"praisonai>=3.9.32" \
19+
"praisonai>=3.9.33" \
2020
"praisonai[ui]" \
2121
"praisonai[crewai]"
2222

src/praisonai-agents/praisonaiagents/workflows/workflows.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class Loop:
134134
var_name: str = "item" # Variable name for current item
135135
parallel: bool = False # Execute iterations in parallel
136136
max_workers: Optional[int] = None # Max parallel workers (None = unlimited)
137+
output_variable: Optional[str] = None # Store loop results in this variable name
137138

138139
def __init__(
139140
self,
@@ -143,7 +144,8 @@ def __init__(
143144
from_file: Optional[str] = None,
144145
var_name: str = "item",
145146
parallel: bool = False,
146-
max_workers: Optional[int] = None
147+
max_workers: Optional[int] = None,
148+
output_variable: Optional[str] = None
147149
):
148150
self.step = step
149151
self.over = over
@@ -152,6 +154,7 @@ def __init__(
152154
self.var_name = var_name
153155
self.parallel = parallel
154156
self.max_workers = max_workers
157+
self.output_variable = output_variable
155158

156159

157160
@dataclass
@@ -194,7 +197,8 @@ def parallel(steps: List) -> Parallel:
194197

195198
def loop(step: Any, over: Optional[str] = None, from_csv: Optional[str] = None,
196199
from_file: Optional[str] = None, var_name: str = "item",
197-
parallel: bool = False, max_workers: Optional[int] = None) -> Loop:
200+
parallel: bool = False, max_workers: Optional[int] = None,
201+
output_variable: Optional[str] = None) -> Loop:
198202
"""Loop over items executing step for each.
199203
200204
Args:
@@ -205,12 +209,14 @@ def loop(step: Any, over: Optional[str] = None, from_csv: Optional[str] = None,
205209
var_name: Variable name for current item (default: "item")
206210
parallel: If True, execute iterations in parallel (default: False)
207211
max_workers: Max parallel workers when parallel=True (default: None = unlimited)
212+
output_variable: Variable name to store all loop outputs (default: None = "loop_outputs")
208213
209214
Returns:
210215
Loop object configured for iteration
211216
"""
212217
return Loop(step=step, over=over, from_csv=from_csv, from_file=from_file,
213-
var_name=var_name, parallel=parallel, max_workers=max_workers)
218+
var_name=var_name, parallel=parallel, max_workers=max_workers,
219+
output_variable=output_variable)
214220

215221

216222
def repeat(step: Any, until: Optional[Callable[[WorkflowContext], bool]] = None,
@@ -1829,10 +1835,16 @@ def execute_item(idx_item_tuple):
18291835
results.append({"step": f"{step_result['step']}_{idx}", "output": step_result["output"]})
18301836
outputs.append(step_result["output"])
18311837
previous_output = step_result["output"]
1832-
1833-
all_variables["loop_outputs"] = outputs
1838+
# Store outputs in user-specified variable or default to loop_outputs
1839+
output_var_name = loop_step.output_variable or "loop_outputs"
1840+
all_variables[output_var_name] = outputs
1841+
all_variables["loop_outputs"] = outputs # Also keep for backward compatibility
18341842
combined_output = "\n".join(str(o) for o in outputs) if outputs else ""
18351843

1844+
# Debug logging for output_variable
1845+
if verbose:
1846+
print(f"📦 Loop stored {len(outputs)} results in variable: '{output_var_name}'")
1847+
18361848
return {"steps": results, "output": combined_output, "variables": all_variables}
18371849

18381850
def _parse_list_from_string(self, text: str) -> List[Any]:

src/praisonai-agents/praisonaiagents/workflows/yaml_parser.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,14 +790,18 @@ def _parse_loop_step(self, step_data: Dict):
790790
if agent_or_step is None:
791791
raise ValueError("Loop step requires an agent or include")
792792

793+
# Extract output_variable from step level (where user specifies it in YAML)
794+
output_variable = step_data.get('output_variable')
795+
793796
return loop(
794797
agent_or_step,
795798
over=over,
796799
from_csv=from_csv,
797800
from_file=from_file,
798801
var_name=var_name,
799802
parallel=parallel_flag,
800-
max_workers=max_workers
803+
max_workers=max_workers,
804+
output_variable=output_variable
801805
)
802806

803807
def _parse_repeat_step(self, step_data: Dict) -> Dict:

src/praisonai-agents/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "praisonaiagents"
7-
version = "0.12.16"
7+
version = "0.12.17"
88
description = "Praison AI agents for completing complex tasks with Self Reflection Agents"
99
readme = "README.md"
1010
requires-python = ">=3.10"

src/praisonai-agents/uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/praisonai/praisonai.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ class Praisonai < Formula
33

44
desc "AI tools for various AI applications"
55
homepage "https://github.com/MervinPraison/PraisonAI"
6-
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v3.9.32.tar.gz"
7-
sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v3.9.32.tar.gz | shasum -a 256`.split.first
6+
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v3.9.33.tar.gz"
7+
sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v3.9.33.tar.gz | shasum -a 256`.split.first
88
license "MIT"
99

1010
depends_on "python@3.11"

src/praisonai/praisonai/deploy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def create_dockerfile(self):
5757
file.write("FROM python:3.11-slim\n")
5858
file.write("WORKDIR /app\n")
5959
file.write("COPY . .\n")
60-
file.write("RUN pip install flask praisonai==3.9.32 gunicorn markdown\n")
60+
file.write("RUN pip install flask praisonai==3.9.33 gunicorn markdown\n")
6161
file.write("EXPOSE 8080\n")
6262
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
6363

src/praisonai/praisonai/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "3.9.32"
1+
__version__ = "3.9.33"

0 commit comments

Comments
 (0)