This commit is contained in:
2026-08-12 14:37:11 +07:00
parent 0cacb5c94a
commit 4e592173a6
3 changed files with 95 additions and 337 deletions
+18 -8
View File
@@ -54,7 +54,7 @@ mutable struct yiemAgent <: agent # High-level agent wrapper
sessionId::Union{String, Nothing} # Optional session identifier
maxRetryDelayMs::Union{Int64, Nothing} # Maximum delay between retries (ms)
parallelToolExecute::Bool # Default: false
agentEventSink::Function # agent emits its status via this function
agentEventSink # agent emits its status via this function
end
"""
@@ -99,7 +99,7 @@ function yiemAgent(
sessionId::Union{String, Nothing}=nothing,
maxRetryDelayMs::Union{Int64, Nothing}=nothing,
parallelToolExecute::Bool=false,
agentEventSink::Function=agentEventSink,
agentEventSink=agentEventSink,
)
# Create channels: input (user -> agent), followUp (async queue), output (agent -> user)
inputChannel = Channel(16)
@@ -209,7 +209,8 @@ function _agent_loop(agent::yiemAgent)
if isready(agent.inputChannel)
# message will be taken in _process_message()
msg = fetch!(agent.inputChannel)
msg = fetch(agent.inputChannel)
agent.agentEventSink("new user msg")
else
yield()
end
@@ -235,9 +236,11 @@ function _agent_loop(agent::yiemAgent)
# start _process_message loop
if agent._state.activeRun == false
agent.agentEventSink("_agent_loop 2")
# Dispatch message through the processing pipeline
processingTask = Threads.@spawn _process_message(agent)
processingTask = Threads.@spawn _process_message(agent)
agent._state.activeRun = true
agent.agentEventSink("_agent_loop 3")
end
# during agent runs, check followUp message after _process_message() is done
@@ -301,6 +304,7 @@ julia> # Currently returns a placeholder echo response
```
"""
function _process_message(agent::yiemAgent)::assistantMessage
agent.agentEventSink("_process_message 1")
# loop until llmCall() response didn't use tool calls
final_response = nothing
while true
@@ -313,21 +317,26 @@ function _process_message(agent::yiemAgent)::assistantMessage
Dict(
"type" => "image_url",
"image_url" => Dict("url" => "data:mime_type;base64,image2_base64_string")
)
),
]
),
)
"""
# Drain inputChannel and convert OpenAI-format messages to userMessage type
while isready(agent.inputChannel)
agent.agentEventSink("_process_message 2")
raw_msg = take!(agent.inputChannel)
agent.agentEventSink("_process_message 3")
if raw_msg === :shutdown
agent.agentEventSink("_process_message 4")
# Re-emit shutdown signal for the loop to handle
put!(agent.inputChannel, :shutdown)
break
end
agent.agentEventSink("_process_message 5")
user_msg = OpenAiToUserMessage(raw_msg)
push!(agent._state.messages, user_msg)
agent.agentEventSink("_process_message 6")
end
# call agent.prepareContext()
@@ -336,10 +345,11 @@ function _process_message(agent::yiemAgent)::assistantMessage
# Call agent.formatMsgForLLM(agent._state) to format for LLM
formatted_messages = agent.formatMsgForLLM(preparedContext)
agent.agentEventSink("_process_message 7")
# Call llmCall() (blocking — the task waits here)
error("debug marker")
response = agent.llmCall(formatted_messages)
error(5555555)
agent.agentEventSink("_process_message 8")
#WORKING Check if LLM used tool calls (inspect content for tool_call blocks)
has_tool_calls = false