feat: (WIP) improve openrouter tool parsing and openai tool encoding
This commit is contained in:
1 parent
7058cf0771
commit
17d3041a60
5 files changed
+164
-96
No files matched your search
+46
-20
@@ -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})
|
||||
Reference in new issue
Block a user