Skip to content
Open
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
3 changes: 2 additions & 1 deletion examples/human_in_the_loop.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import asyncio

from narada import Agent, Narada, UserAbortedError
from narada_core.actions.models import PromptForUserInputVariable

from narada import Agent, Narada, UserAbortedError


async def main() -> None:
async with Narada() as narada:
Expand Down
11 changes: 11 additions & 0 deletions packages/narada-core/src/narada_core/actions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,17 @@ class UserApprovalResponse(BaseModel):
approved: bool


ActiveInputAction = Annotated[
PromptForUserInputRequest | UserApprovalRequest,
Field(discriminator="name"),
]


class ActiveInputRequest(BaseModel):
input_id: str = Field(alias="inputId")
action: ActiveInputAction


type ExtensionActionRequest = (
AgenticSelectorRequest
| AgenticMatchingSelectorsFinderRequest
Expand Down
26 changes: 25 additions & 1 deletion packages/narada-core/src/narada_core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

from pydantic import BaseModel, Field

from narada_core.actions.models import ActiveInputRequest


class Agent(Enum):
PRODUCTIVITY = 1
Expand Down Expand Up @@ -395,8 +397,19 @@ class PythonAgentRunTrace(TypedDict):
type ActionTrace = OperatorActionTrace | APAActionTrace


class TextResponseOutput(TypedDict):
type: Literal["text"]
content: str


class StructuredResponseOutput(TypedDict, Generic[_MaybeStructuredOutput]):
type: Literal["structured"]
content: _MaybeStructuredOutput


class ResponseContent(TypedDict, Generic[_MaybeStructuredOutput]):
text: str
output: TextResponseOutput | StructuredResponseOutput[_MaybeStructuredOutput]
structuredOutput: _MaybeStructuredOutput
actionTrace: NotRequired[ActionTrace]
workflowTrace: NotRequired[dict[str, Any]]
Expand All @@ -409,11 +422,22 @@ class Usage(TypedDict):

class Response(TypedDict, Generic[_MaybeStructuredOutput]):
requestId: str
status: Literal["success", "error"]
status: Literal["success", "error", "input-required"]
response: ResponseContent[_MaybeStructuredOutput] | None
createdAt: str
completedAt: str | None
usage: Usage
activeInputRequest: ActiveInputRequest | None


class _RemoteDispatchPollResponse(TypedDict):
requestId: str
status: Literal["pending", "input-required", "success", "error"]
response: dict[str, Any] | None
createdAt: str
completedAt: str | None
usage: Usage | None
activeInputRequest: ActiveInputRequest | None


class File(TypedDict):
Expand Down
2 changes: 1 addition & 1 deletion packages/narada-core/src/narada_core/tracing/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ class PythonSubAgentCallEvent(BaseModel):
ts_end: int
agent_type: str
prompt: str
status: Literal["success", "error", "timeout"]
status: Literal["success", "error", "timeout", "input-required"]
request_id: str | None = None
text: str | None = None
error_message: str | None = None
Expand Down
3 changes: 2 additions & 1 deletion packages/narada-pyodide/src/narada/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from narada_core.actions.models import CriticResult
from narada_core.actions.models import ActiveInputRequest, CriticResult
from narada_core.errors import (
NaradaError,
NaradaTimeoutError,
Expand All @@ -23,6 +23,7 @@

__all__ = [
"__version__",
"ActiveInputRequest",
"Agent",
"CloudBrowserWindow",
"CriticConfig",
Expand Down
2 changes: 1 addition & 1 deletion packages/narada-pyodide/src/narada/_trace.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def dump_model(model: BaseModel) -> dict[str, Any]:
# ---------------------------------------------------------------------------


SubAgentCallStatus = Literal["success", "error", "timeout"]
SubAgentCallStatus = Literal["success", "error", "timeout", "input-required"]
ExtensionActionStatus = Literal["success", "error", "timeout"]
SideEffectType = Literal["download_file", "render_html"]

Expand Down
Loading
Loading