feat: (WIP) improve openrouter tool parsing and openai tool encoding

This commit is contained in:
Shivering Ocelot committed 2026-06-04 11:27:42 -05:00
1 parent 7058cf0771
commit 17d3041a60
5 files changed
+164 -96

No files matched your search

+46 -20
View File
@@ -4,6 +4,7 @@ import inspect
import time
from temporary import generate_tmp_id
from stream import Stream
# Tool related classes must be moved to a different module
@@ -53,7 +54,7 @@ class Agent:
},
)
await self.run(run)
return run.stream
return run.get_output_stream()
async def received_message(self, message):
chat_view = await self.app.get_chat_view(message.chat_id)
@@ -77,18 +78,22 @@ class Agent:
)
await self.run(run)
new_message = await self.app.send_chat_message(
sender=self.id,
chat_id=message.chat_id,
thread_id=message.thread_id,
content=run.stream,
)
run.emit_event('chat-message', {
'messageId': new_message['id'],
'chatId': message.chat_id,
'threadId': message.thread_id,
})
return run.stream
async def on_output_event(data):
new_message = await self.app.send_chat_message(
sender=self.id,
chat_id=message.chat_id,
thread_id=message.thread_id,
content=data.stream,
)
run.emit_event('chat-message', {
'messageId': new_message['id'],
'chatId': message.chat_id,
'threadId': message.thread_id,
})
run.on('output', on_output_event)
return run
def _role_for_message(self, message):
sender = message.sender
@@ -138,11 +143,12 @@ class AgentRun:
# I/O envelope (no generic data bag)
self.input = input or {}
from stream import Stream
self.stream = Stream(app)
self.events = []
self.event_listeners = {}
# Default Streams
self.output = None
self.reasoning = None
# Cancellation tracking
self.task = None # For asyncio tasks
@@ -156,7 +162,6 @@ class AgentRun:
"userId": self.user_id,
"startTime": self.start_time,
"input": self.input,
"streamId": self.stream.id,
})
return self
@@ -185,7 +190,10 @@ class AgentRun:
self.events.append(event)
listeners = self.event_listeners.get(event_name, [])
for cb in listeners:
cb(data)
try:
cb(data)
except Exception as e:
print(f"ERROR: handling event '{event_name}' in run {self.id}\n" + str(e))
# Broadcast event to websocket listeners
self.app.emit_event("run-event", {
@@ -193,6 +201,24 @@ class AgentRun:
"name": event_name,
"data": data
})
def get_output_stream(self):
if not self.output:
self.output = Stream(self.app)
self.emit_event('output', self.output)
return self.output
def feed_output(self, chunk):
stream = self.get_output_stream()
if chunk:
self.output.feed(chunk)
def feed_reasoning(self, chunk):
if not self.reasoning:
self.reasoning = Stream(self.app)
self.emit_event('reasoning', self.reasoning)
if chunk:
self.reasoning.feed(chunk)
def add_tool_call(self, tool_name, arguments):
self.emit_event("tool_call", {"name": tool_name, "arguments": arguments})
@@ -261,6 +287,6 @@ class AgentRun:
return
self.done = True
self.end_time = int(time.time())
self.output = self.stream.content
self.stream.close()
self.emit_event("done", {"output": self.output, "agent_id": self.agent_id})
if self.output: self.output.close()
if self.reasoning: self.reasoning.close()
self.emit_event("done", {"output": self.output.content, "agent_id": self.agent_id})