Skip to content

Commit e3c29b2

Browse files
fix 4090
1 parent 74df727 commit e3c29b2

4 files changed

Lines changed: 32 additions & 22 deletions

File tree

fastloop/fastloop.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
)
2626
from .integrations import Integration
2727
from .logging import configure_logging, setup_logger
28-
from .loop import Loop, LoopEvent, LoopManager, Workflow, WorkflowBlock, WorkflowManager
28+
from .loop import Loop, LoopEvent, LoopManager, Workflow, WorkflowManager
2929
from .state.state import StateManager, create_state_manager
3030
from .types import BaseConfig, LoopStatus
3131
from .utils import get_func_import_path, import_func_from_path, infer_application_path
@@ -499,29 +499,40 @@ def _decorator(
499499
"workflow_instance": workflow_instance,
500500
}
501501

502-
class WorkflowStartRequest(BaseModel):
503-
type: str
504-
blocks: list[WorkflowBlock]
505-
workflow_id: str | None = None
502+
async def _start_handler(request: dict[str, Any]):
503+
event_type = request.get("type")
504+
blocks_raw = request.get("blocks", [])
505+
workflow_id_req = request.get("workflow_id")
506506

507-
async def _start_handler(request: WorkflowStartRequest):
508-
if start_event_key and request.type != start_event_key:
507+
if start_event_key and event_type != start_event_key:
509508
raise HTTPException(
510509
status_code=HTTPStatus.BAD_REQUEST,
511510
detail=f"Expected event type '{start_event_key}'",
512511
)
513512

514-
try:
515-
workflow, _ = await self.state_manager.get_or_create_workflow(
516-
workflow_name=name,
517-
workflow_id=request.workflow_id,
518-
blocks=[b.model_dump() for b in request.blocks],
519-
)
520-
except WorkflowNotFoundError as e:
513+
if not blocks_raw or not isinstance(blocks_raw, list):
521514
raise HTTPException(
522-
status_code=HTTPStatus.NOT_FOUND,
523-
detail=f"Workflow {request.workflow_id} not found",
524-
) from e
515+
status_code=HTTPStatus.BAD_REQUEST,
516+
detail="blocks is required and must be a list",
517+
)
518+
519+
for i, block in enumerate(blocks_raw):
520+
if not isinstance(block, dict):
521+
raise HTTPException(
522+
status_code=HTTPStatus.BAD_REQUEST,
523+
detail=f"blocks[{i}] must be an object",
524+
)
525+
if "text" not in block or "type" not in block:
526+
raise HTTPException(
527+
status_code=HTTPStatus.BAD_REQUEST,
528+
detail=f"blocks[{i}] must have 'text' and 'type' fields",
529+
)
530+
531+
workflow, _ = await self.state_manager.get_or_create_workflow(
532+
workflow_name=name,
533+
workflow_id=workflow_id_req,
534+
blocks=blocks_raw,
535+
)
525536

526537
if workflow.status == LoopStatus.STOPPED:
527538
raise HTTPException(

fastloop/state/state_redis.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -639,10 +639,9 @@ async def get_or_create_workflow(
639639
)
640640
if workflow_str:
641641
return WorkflowState.from_json(workflow_str.decode("utf-8")), False
642-
else:
643-
raise WorkflowNotFoundError(f"Workflow {workflow_id} not found")
642+
else:
643+
workflow_id = str(uuid.uuid4())
644644

645-
workflow_id = str(uuid.uuid4())
646645
workflow = WorkflowState(
647646
workflow_id=workflow_id,
648647
workflow_name=workflow_name,

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "fastloop"
3-
version = "0.1.79"
3+
version = "0.1.80"
44
description = "A Python package for deploying stateful loops"
55
readme = "README.md"
66
requires-python = ">=3.12"

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.

0 commit comments

Comments
 (0)