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
46 changes: 29 additions & 17 deletions agents/translation_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
settings,
)

from utils.runtime_state_sync import (
refresh_runtime_state,
from utils.token_usage import (
record_token_usage,
)


Expand Down Expand Up @@ -45,20 +45,32 @@ async def run(
translated_text
)

await refresh_runtime_state(
context,
runtime_id=(
settings.TRANSLATOR_MODEL_UID
),
add_tokens=usage.get(
"total_tokens",
0,
),
max_tokens=(
settings.TRANSLATOR_CONTEXT_WINDOW
),
last_error=None,
status="online",
)
if usage:
record_token_usage(
context,
runtime_id=(
settings.TRANSLATOR_MODEL_UID
),
role="translator",
kind="service",
prompt_tokens=(
usage.get(
"prompt_tokens",
0,
)
),
completion_tokens=(
usage.get(
"completion_tokens",
0,
)
),
total_tokens=(
usage.get(
"total_tokens",
0,
)
),
)

state.translated_input = translated_text
30 changes: 5 additions & 25 deletions contracts/context_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,14 @@
)


def cdata(
value: str,
) -> str:

return (
"<![CDATA["
f"{str(value).replace(']]>', ']]]]><![CDATA[>')}"
"]]>"
)


def format_xml_field(
tag: str,
value,
) -> str:

if tag.endswith(
"_ACTION"
):
rendered_value = cdata(
str(value)
)

else:
rendered_value = escape(
str(value)
)
rendered_value = escape(
str(value)
)

return f"<{tag}>{rendered_value}</{tag}>"

Expand All @@ -55,7 +36,7 @@ def format_available_actions(
(
" "
f"<ACTION name=\"{escape(name)}\">"
f"{cdata(template)}"
f"{template}"
"</ACTION>"
)
for name, template
Expand Down Expand Up @@ -96,13 +77,12 @@ def build_runtime_fields(self) -> str:
fields = {
"TIMESTAMP": self.timestamp,
"WEEKDAY": self.weekday,
"YEAR": self.year,
}

available_actions = []

if self.can_deep_thought:
fields["DEEP_THOUGHT_COUNTER"] = self.deep_thought_count
fields["DEEP_THOUGHT_COUNTER"] = str(self.deep_thought_count)
available_actions.append(
(
RUNTIME_ACTION_DEEP_THOUGHT,
Expand Down
4 changes: 4 additions & 0 deletions runtime/runtime_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,7 @@ class RuntimeContext:
runtime_action_events: list[dict] = field(
default_factory=list
)

runtime_usage_events: list[dict] = field(
default_factory=list
)
142 changes: 121 additions & 21 deletions runtime/runtime_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
StreamHandler,
)

from utils.token_usage import (
record_stream_token_usage,
)

from utils.tokens import (
estimate_stream_tokens,
estimate_stream_live_tokens,
)


Expand Down Expand Up @@ -45,6 +49,7 @@ def __init__(

self.log_method = log_method
self.emit_to_chat = emit_to_chat
self.context_snapshot = context_snapshot or {}

self.stream = StreamHandler(
self.websocket,
Expand All @@ -58,6 +63,113 @@ def __init__(
),
)

def build_input_prompt_text(self) -> str:

if not isinstance(
self.context_snapshot,
dict,
):
return ""

parts = []

for key in (
"system_prompt",
"user_prompt",
"context_payload",
):

value = self.context_snapshot.get(
key,
"",
)

if value:
parts.append(
str(value)
)

return "\n".join(
parts
)

def is_brain_context(self) -> bool:

if not isinstance(
self.context_snapshot,
dict,
):
return False

return (
self.context_snapshot.get(
"context_role"
)
== "brain"
)

def estimate_live_tokens(self) -> int:

return estimate_stream_live_tokens(
self.stream,
prompt_text=(
self.build_input_prompt_text()
),
)

async def refresh_token_usage(self):

if not self.is_brain_context():
return

used_tokens = (
self.estimate_live_tokens()
)

if not used_tokens:
return

await refresh_runtime_state(
self.context,
runtime_id=(
self.runtime_id
),
used_tokens=(
used_tokens
),
max_tokens=(
self.context_window
),
last_error=None,
status="online",
)

def record_token_usage(self):
is_brain_context = self.is_brain_context()

record_stream_token_usage(
self.context,
runtime_id=(
self.runtime_id
),
role=(
"brain"
if is_brain_context
else self.role
),
kind=(
"brain"
if is_brain_context
else "service"
),
stream=(
self.stream
),
prompt_text=(
self.build_input_prompt_text()
),
)

def build_action_log(
self,
action_event_offset: int,
Expand Down Expand Up @@ -133,6 +245,8 @@ async def run(
emit=self.emit_to_chat
)

await self.refresh_token_usage()

await self.logger.log_runtime(
f"[STREAM START] role={self.role}"
)
Expand Down Expand Up @@ -171,6 +285,8 @@ async def run(
emit=self.emit_to_chat,
)

await self.refresh_token_usage()

continue

# -------------------------------------------------
Expand All @@ -196,30 +312,14 @@ async def run(

return None

await self.refresh_token_usage()

await self.stream.finish(
emit=self.emit_to_chat
)

used_tokens = (
estimate_stream_tokens(
self.stream
)
)

await refresh_runtime_state(
self.context,
runtime_id=(
self.runtime_id
),
used_tokens=(
used_tokens
),
max_tokens=(
self.context_window
),
last_error=None,
status="online",
)
await self.refresh_token_usage()
self.record_token_usage()

log_response = self.stream.response

Expand Down
5 changes: 5 additions & 0 deletions static/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,11 @@ function appendLog(
"text-emerald-500";
}

if (tag.includes("FLOW TELEMETRY")) {
tagClass =
"text-purple-400";
}

if (tag.includes("ERROR")) {
tagClass =
"text-red-500 font-bold";
Expand Down
23 changes: 19 additions & 4 deletions tests/test_brain_runtime_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,18 @@ def test_prompt_uses_passed_agent_runtime_actions(self):

self.assertIn(
(
'<ACTION name="SEARCH"><![CDATA['
'<ACTION name="SEARCH">'
f"{SEARCH_ACTION_TEMPLATE}"
"]]></ACTION>"
"</ACTION>"
),
prompt,
)

self.assertNotIn(
"<![CDATA[",
prompt,
)

self.assertNotIn(
"&lt;RUNTIME_ACTION:SEARCH&gt;",
prompt,
Expand All @@ -99,6 +104,11 @@ def test_prompt_uses_passed_agent_runtime_actions(self):
prompt,
)

self.assertNotIn(
"<YEAR>",
prompt,
)

self.assertNotIn(
"RUNTIME_STATE",
prompt,
Expand Down Expand Up @@ -135,13 +145,18 @@ def test_prompt_can_flip_agent_actions_dynamically(self):

self.assertIn(
(
'<ACTION name="DEEP_THOUGHT"><![CDATA['
'<ACTION name="DEEP_THOUGHT">'
f"{DEEP_THOUGHT_ACTION}"
"]]></ACTION>"
"</ACTION>"
),
prompt,
)

self.assertNotIn(
"<![CDATA[",
prompt,
)

self.assertNotIn(
SEARCH_ACTION_TEMPLATE,
prompt,
Expand Down
Loading