Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/narada-core/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "narada-core"
version = "0.0.19"
version = "0.0.20"
description = "Code shared by the `narada` and `narada-pyodide` packages."
license = "Apache-2.0"
readme = "README.md"
Expand Down
263 changes: 7 additions & 256 deletions packages/narada-core/src/narada_core/actions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@
override,
)

from pydantic import BaseModel, Field, TypeAdapter, ValidationError
from pydantic import (
BaseModel,
Field,
)

from narada_core.tracing import model as tracing_model

# There is no `AgentRequest` because the `agent` action delegates to the `dispatch_request` method
# under the hood.
Expand All @@ -25,260 +30,6 @@ class AgentUsage(BaseModel):
credits: float


class OperatorActionTraceItem(BaseModel):
url: str
action: str


class GoToUrlTrace(BaseModel):
step_type: Literal["goToUrl"]
url: str
description: str


class GetUrlTrace(BaseModel):
step_type: Literal["getUrl"]
url: str
description: str


class PrintTrace(BaseModel):
step_type: Literal["print"]
url: str
message: str


class AgentTrace(BaseModel):
step_type: Literal["agent"]
url: str
agent_type: str
action_trace: ActionTrace | None = None
text: str | None = None


class ForLoopTrace(BaseModel):
step_type: Literal["for"]
url: str
loop_type: Literal["nTimes", "forEachRowInDataTable", "forEachItemsInArray"]
description: str
iterations: list[ApaActionTrace] # Recursive reference


class WhileLoopTrace(BaseModel):
step_type: Literal["while"]
url: str
condition: str
iterations: list[ApaActionTrace] # Recursive reference
total_iterations: int


class AgenticSelectorTrace(BaseModel):
step_type: Literal["agenticSelector"]
url: str
description: str
action_trace: ActionTrace | None = None


class AgenticMouseActionTrace(BaseModel):
step_type: Literal["agenticMouseAction"]
url: str
description: str
action_trace: ActionTrace | None = None


class WaitForElementTrace(BaseModel):
step_type: Literal["waitForElement"]
url: str
description: str


class PressKeysTrace(BaseModel):
step_type: Literal["pressKeys"]
url: str
description: str


class ReadGoogleSheetTrace(BaseModel):
step_type: Literal["readGoogleSheet"]
url: str
description: str


class ReadExcelSheetTrace(BaseModel):
step_type: Literal["readExcelSheet"]
url: str
description: str


class WriteGoogleSheetTrace(BaseModel):
step_type: Literal["writeGoogleSheet"]
url: str
description: str


class WriteExcelSheetTrace(BaseModel):
step_type: Literal["writeExcelSheet"]
url: str
description: str


class DataTableExportAsCsvTrace(BaseModel):
step_type: Literal["dataTableExportAsCsv"]
url: str
description: str


class PythonTrace(BaseModel):
step_type: Literal["python"]
url: str
description: str


class ReadCsvTrace(BaseModel):
step_type: Literal["readCsv"]
url: str
description: str


class StartTrace(BaseModel):
step_type: Literal["start"]
url: str
description: str


class EndTrace(BaseModel):
step_type: Literal["end"]
url: str
description: str


class GetFullHtmlTrace(BaseModel):
step_type: Literal["getFullHtml"]
url: str
description: str


class GetSimplifiedHtmlTrace(BaseModel):
step_type: Literal["getSimplifiedHtml"]
url: str
description: str


class GetScreenshotTrace(BaseModel):
step_type: Literal["getScreenshot"]
url: str
description: str


class ObjectExportAsJsonTrace(BaseModel):
step_type: Literal["objectExportAsJson"]
url: str
description: str


class RunCustomAgentTrace(BaseModel):
step_type: Literal["runCustomAgent"]
url: str
workflow_id: str
workflow_name: str
status: Literal["success", "error"]
error_message: str | None = None


class IfTrace(BaseModel):
step_type: Literal["if"]
url: str
description: str


class SetVariableTrace(BaseModel):
step_type: Literal["setVariable"]
url: str
description: str


class WaitTrace(BaseModel):
step_type: Literal["wait"]
url: str
description: str


class DataTableInsertRowTrace(BaseModel):
step_type: Literal["dataTableInsertRow"]
url: str
description: str


class DataTableUpdateCellValueTrace(BaseModel):
step_type: Literal["dataTableUpdateCellValue"]
url: str
description: str


class ObjectSetPropertiesTrace(BaseModel):
step_type: Literal["objectSetProperties"]
url: str
description: str


class OutputTrace(BaseModel):
step_type: Literal["output"]
description: str


ApaStepTrace = Annotated[
GoToUrlTrace
| GetUrlTrace
| PrintTrace
| AgentTrace
| ForLoopTrace
| WhileLoopTrace
| AgenticSelectorTrace
| AgenticMouseActionTrace
| WaitForElementTrace
| PressKeysTrace
| ReadCsvTrace
| ReadGoogleSheetTrace
| ReadExcelSheetTrace
| WriteGoogleSheetTrace
| WriteExcelSheetTrace
| DataTableExportAsCsvTrace
| ObjectExportAsJsonTrace
| PythonTrace
| StartTrace
| EndTrace
| GetFullHtmlTrace
| GetSimplifiedHtmlTrace
| GetScreenshotTrace
| RunCustomAgentTrace
| IfTrace
| SetVariableTrace
| WaitTrace
| DataTableInsertRowTrace
| DataTableUpdateCellValueTrace
| ObjectSetPropertiesTrace
| OutputTrace,
Field(discriminator="step_type"),
]

type OperatorActionTrace = list[OperatorActionTraceItem]
type ApaActionTrace = list[ApaStepTrace]
type ActionTrace = OperatorActionTrace | ApaActionTrace


# TypeAdapter for parsing discriminated union
_OperatorActionTraceAdapter = TypeAdapter(OperatorActionTrace)
_ApaActionTraceAdapter = TypeAdapter(ApaActionTrace)


def parse_action_trace(trace_data: list[dict[str, Any] | Any]) -> ActionTrace:
"""Parse the action trace, it will either be a list of operator action trace items or a list of APA action trace items."""
try:
return _OperatorActionTraceAdapter.validate_python(trace_data)
except ValidationError:
return _ApaActionTraceAdapter.validate_python(trace_data)


class TextOutput(BaseModel):
type: Literal["text"]
content: str
Expand All @@ -299,7 +50,7 @@ class AgentResponse(BaseModel, Generic[_StructuredOutputT]):
Field(discriminator="type"),
]
usage: AgentUsage
action_trace: ActionTrace | None = None
action_trace: tracing_model.ActionTrace | None = None


class AgenticSelectorClickAction(TypedDict):
Expand Down
1 change: 1 addition & 0 deletions packages/narada-core/src/narada_core/tracing/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Tracing models for narada-core."""
Loading
Loading