[model-gateway] grpc to leverage event type (#14450)
Co-authored-by: Chang Su <chang.s.su@oracle.com>
This commit is contained in:
@@ -81,6 +81,56 @@ impl fmt::Display for FunctionCallEvent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Content part streaming events
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
|
pub enum ContentPartEvent {
|
||||||
|
Added,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ContentPartEvent {
|
||||||
|
pub const ADDED: &'static str = "response.content_part.added";
|
||||||
|
pub const DONE: &'static str = "response.content_part.done";
|
||||||
|
|
||||||
|
pub const fn as_str(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
Self::Added => Self::ADDED,
|
||||||
|
Self::Done => Self::DONE,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for ContentPartEvent {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.write_str(self.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Output text streaming events
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
|
pub enum OutputTextEvent {
|
||||||
|
Delta,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OutputTextEvent {
|
||||||
|
pub const DELTA: &'static str = "response.output_text.delta";
|
||||||
|
pub const DONE: &'static str = "response.output_text.done";
|
||||||
|
|
||||||
|
pub const fn as_str(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
Self::Delta => Self::DELTA,
|
||||||
|
Self::Done => Self::DONE,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for OutputTextEvent {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.write_str(self.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// MCP Events
|
// MCP Events
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -92,6 +142,7 @@ pub enum McpEvent {
|
|||||||
CallArgumentsDone,
|
CallArgumentsDone,
|
||||||
CallInProgress,
|
CallInProgress,
|
||||||
CallCompleted,
|
CallCompleted,
|
||||||
|
CallFailed,
|
||||||
ListToolsInProgress,
|
ListToolsInProgress,
|
||||||
ListToolsCompleted,
|
ListToolsCompleted,
|
||||||
}
|
}
|
||||||
@@ -101,6 +152,7 @@ impl McpEvent {
|
|||||||
pub const CALL_ARGUMENTS_DONE: &'static str = "response.mcp_call_arguments.done";
|
pub const CALL_ARGUMENTS_DONE: &'static str = "response.mcp_call_arguments.done";
|
||||||
pub const CALL_IN_PROGRESS: &'static str = "response.mcp_call.in_progress";
|
pub const CALL_IN_PROGRESS: &'static str = "response.mcp_call.in_progress";
|
||||||
pub const CALL_COMPLETED: &'static str = "response.mcp_call.completed";
|
pub const CALL_COMPLETED: &'static str = "response.mcp_call.completed";
|
||||||
|
pub const CALL_FAILED: &'static str = "response.mcp_call.failed";
|
||||||
pub const LIST_TOOLS_IN_PROGRESS: &'static str = "response.mcp_list_tools.in_progress";
|
pub const LIST_TOOLS_IN_PROGRESS: &'static str = "response.mcp_list_tools.in_progress";
|
||||||
pub const LIST_TOOLS_COMPLETED: &'static str = "response.mcp_list_tools.completed";
|
pub const LIST_TOOLS_COMPLETED: &'static str = "response.mcp_list_tools.completed";
|
||||||
|
|
||||||
@@ -110,6 +162,7 @@ impl McpEvent {
|
|||||||
Self::CallArgumentsDone => Self::CALL_ARGUMENTS_DONE,
|
Self::CallArgumentsDone => Self::CALL_ARGUMENTS_DONE,
|
||||||
Self::CallInProgress => Self::CALL_IN_PROGRESS,
|
Self::CallInProgress => Self::CALL_IN_PROGRESS,
|
||||||
Self::CallCompleted => Self::CALL_COMPLETED,
|
Self::CallCompleted => Self::CALL_COMPLETED,
|
||||||
|
Self::CallFailed => Self::CALL_FAILED,
|
||||||
Self::ListToolsInProgress => Self::LIST_TOOLS_IN_PROGRESS,
|
Self::ListToolsInProgress => Self::LIST_TOOLS_IN_PROGRESS,
|
||||||
Self::ListToolsCompleted => Self::LIST_TOOLS_COMPLETED,
|
Self::ListToolsCompleted => Self::LIST_TOOLS_COMPLETED,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ use crate::{
|
|||||||
protocols::{
|
protocols::{
|
||||||
chat::ChatCompletionStreamResponse,
|
chat::ChatCompletionStreamResponse,
|
||||||
common::{Usage, UsageInfo},
|
common::{Usage, UsageInfo},
|
||||||
|
event_types::{
|
||||||
|
ContentPartEvent, FunctionCallEvent, McpEvent, OutputItemEvent, OutputTextEvent,
|
||||||
|
ResponseEvent,
|
||||||
|
},
|
||||||
responses::{
|
responses::{
|
||||||
ResponseOutputItem, ResponseStatus, ResponsesRequest, ResponsesResponse, ResponsesUsage,
|
ResponseOutputItem, ResponseStatus, ResponsesRequest, ResponsesResponse, ResponsesUsage,
|
||||||
},
|
},
|
||||||
@@ -159,7 +163,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
pub fn emit_created(&mut self) -> serde_json::Value {
|
pub fn emit_created(&mut self) -> serde_json::Value {
|
||||||
self.has_emitted_created = true;
|
self.has_emitted_created = true;
|
||||||
json!({
|
json!({
|
||||||
"type": "response.created",
|
"type": ResponseEvent::CREATED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"response": {
|
"response": {
|
||||||
"id": self.response_id,
|
"id": self.response_id,
|
||||||
@@ -175,7 +179,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
pub fn emit_in_progress(&mut self) -> serde_json::Value {
|
pub fn emit_in_progress(&mut self) -> serde_json::Value {
|
||||||
self.has_emitted_in_progress = true;
|
self.has_emitted_in_progress = true;
|
||||||
json!({
|
json!({
|
||||||
"type": "response.in_progress",
|
"type": ResponseEvent::IN_PROGRESS,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"response": {
|
"response": {
|
||||||
"id": self.response_id,
|
"id": self.response_id,
|
||||||
@@ -193,7 +197,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
self.has_emitted_content_part_added = true;
|
self.has_emitted_content_part_added = true;
|
||||||
json!({
|
json!({
|
||||||
"type": "response.content_part.added",
|
"type": ContentPartEvent::ADDED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -214,7 +218,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
self.accumulated_text.push_str(delta);
|
self.accumulated_text.push_str(delta);
|
||||||
json!({
|
json!({
|
||||||
"type": "response.output_text.delta",
|
"type": OutputTextEvent::DELTA,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -230,7 +234,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
content_index: usize,
|
content_index: usize,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.output_text.done",
|
"type": OutputTextEvent::DONE,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -246,7 +250,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
content_index: usize,
|
content_index: usize,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.content_part.done",
|
"type": ContentPartEvent::DONE,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -336,7 +340,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"type": "response.completed",
|
"type": ResponseEvent::COMPLETED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"response": response_obj
|
"response": response_obj
|
||||||
})
|
})
|
||||||
@@ -359,7 +363,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
|
|
||||||
pub fn emit_mcp_list_tools_in_progress(&mut self, output_index: usize) -> serde_json::Value {
|
pub fn emit_mcp_list_tools_in_progress(&mut self, output_index: usize) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_list_tools.in_progress",
|
"type": McpEvent::LIST_TOOLS_IN_PROGRESS,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index
|
"output_index": output_index
|
||||||
})
|
})
|
||||||
@@ -382,7 +386,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_list_tools.completed",
|
"type": McpEvent::LIST_TOOLS_COMPLETED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"tools": tool_items
|
"tools": tool_items
|
||||||
@@ -395,7 +399,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
item_id: &str,
|
item_id: &str,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_call.in_progress",
|
"type": McpEvent::CALL_IN_PROGRESS,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id
|
"item_id": item_id
|
||||||
@@ -415,7 +419,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
.push_str(delta);
|
.push_str(delta);
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_call_arguments.delta",
|
"type": McpEvent::CALL_ARGUMENTS_DELTA,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -430,7 +434,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
arguments: &str,
|
arguments: &str,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_call_arguments.done",
|
"type": McpEvent::CALL_ARGUMENTS_DONE,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -444,7 +448,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
item_id: &str,
|
item_id: &str,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_call.completed",
|
"type": McpEvent::CALL_COMPLETED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id
|
"item_id": item_id
|
||||||
@@ -458,7 +462,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
error: &str,
|
error: &str,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.mcp_call.failed",
|
"type": McpEvent::CALL_FAILED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -477,7 +481,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
delta: &str,
|
delta: &str,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.function_call_arguments.delta",
|
"type": FunctionCallEvent::ARGUMENTS_DELTA,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -492,7 +496,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
arguments: &str,
|
arguments: &str,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.function_call_arguments.done",
|
"type": FunctionCallEvent::ARGUMENTS_DONE,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item_id": item_id,
|
"item_id": item_id,
|
||||||
@@ -511,7 +515,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
item: &serde_json::Value,
|
item: &serde_json::Value,
|
||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "response.output_item.added",
|
"type": OutputItemEvent::ADDED,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item": item
|
"item": item
|
||||||
@@ -528,7 +532,7 @@ impl ResponseStreamEventEmitter {
|
|||||||
self.store_output_item_data(output_index, item.clone());
|
self.store_output_item_data(output_index, item.clone());
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"type": "response.output_item.done",
|
"type": OutputItemEvent::DONE,
|
||||||
"sequence_number": self.next_sequence(),
|
"sequence_number": self.next_sequence(),
|
||||||
"output_index": output_index,
|
"output_index": output_index,
|
||||||
"item": item
|
"item": item
|
||||||
|
|||||||
Reference in New Issue
Block a user