Skip to content

Commit f68527f

Browse files
committed
feat: refactor message handling to use centralized flow handlers
1 parent 7746975 commit f68527f

2 files changed

Lines changed: 60 additions & 31 deletions

File tree

src/routes/messages/handler.ts

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ import { parseSubagentMarkerFromFirstUser } from "./subagent-marker"
2727

2828
const logger = createHandlerLogger("messages-handler")
2929

30+
export const messagesFlowHandlers = {
31+
handleWithChatCompletions,
32+
handleWithMessagesApi,
33+
handleWithResponsesApi,
34+
}
35+
3036
export async function handleCompletion(c: Context) {
3137
await checkRateLimit(state)
3238

@@ -81,35 +87,47 @@ export async function handleCompletion(c: Context) {
8187
anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model
8288

8389
if (shouldUseMessagesApi(selectedModel)) {
84-
return await handleWithMessagesApi(c, anthropicPayload, {
85-
anthropicBetaHeader: anthropicBeta,
86-
subagentMarker,
87-
selectedModel,
88-
requestId,
89-
sessionId,
90-
compactType,
91-
logger,
92-
})
90+
return await messagesFlowHandlers.handleWithMessagesApi(
91+
c,
92+
anthropicPayload,
93+
{
94+
anthropicBetaHeader: anthropicBeta,
95+
subagentMarker,
96+
selectedModel,
97+
requestId,
98+
sessionId,
99+
compactType,
100+
logger,
101+
},
102+
)
93103
}
94104

95105
if (shouldUseResponsesApi(selectedModel)) {
96-
return await handleWithResponsesApi(c, anthropicPayload, {
106+
return await messagesFlowHandlers.handleWithResponsesApi(
107+
c,
108+
anthropicPayload,
109+
{
110+
subagentMarker,
111+
selectedModel,
112+
requestId,
113+
sessionId,
114+
compactType,
115+
logger,
116+
},
117+
)
118+
}
119+
120+
return await messagesFlowHandlers.handleWithChatCompletions(
121+
c,
122+
anthropicPayload,
123+
{
97124
subagentMarker,
98-
selectedModel,
99125
requestId,
100126
sessionId,
101127
compactType,
102128
logger,
103-
})
104-
}
105-
106-
return await handleWithChatCompletions(c, anthropicPayload, {
107-
subagentMarker,
108-
requestId,
109-
sessionId,
110-
compactType,
111-
logger,
112-
})
129+
},
130+
)
113131
}
114132

115133
const RESPONSES_ENDPOINT = "/responses"

tests/messages-handler.test.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { beforeEach, describe, expect, mock, test } from "bun:test"
1+
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test"
22
import { Hono } from "hono"
33

44
import type { AnthropicMessagesPayload } from "../src/routes/messages/anthropic-types"
@@ -36,21 +36,21 @@ const handleWithMessagesApi = mock(
3636
_c: unknown,
3737
_payload: AnthropicMessagesPayload,
3838
_options: FlowCallOptions,
39-
) => new Response("messages"),
39+
) => Promise.resolve(new Response("messages")),
4040
)
4141
const handleWithResponsesApi = mock(
4242
(
4343
_c: unknown,
4444
_payload: AnthropicMessagesPayload,
4545
_options: FlowCallOptions,
46-
) => new Response("responses"),
46+
) => Promise.resolve(new Response("responses")),
4747
)
4848
const handleWithChatCompletions = mock(
4949
(
5050
_c: unknown,
5151
_payload: AnthropicMessagesPayload,
5252
_options: FlowCallOptions,
53-
) => new Response("chat"),
53+
) => Promise.resolve(new Response("chat")),
5454
)
5555

5656
await mock.module("~/lib/state", () => ({
@@ -73,13 +73,11 @@ await mock.module("~/lib/models", () => ({
7373
await mock.module("~/lib/utils", () => ({
7474
...actualUtilsModule,
7575
}))
76-
await mock.module("~/routes/messages/api-flows", () => ({
77-
handleWithMessagesApi,
78-
handleWithResponsesApi,
79-
handleWithChatCompletions,
80-
}))
76+
const { handleCompletion, messagesFlowHandlers } = await import(
77+
"../src/routes/messages/handler"
78+
)
8179

82-
const { handleCompletion } = await import("../src/routes/messages/handler")
80+
const defaultMessagesFlowHandlers = { ...messagesFlowHandlers }
8381

8482
const createApp = () => {
8583
const app = new Hono()
@@ -102,12 +100,25 @@ beforeEach(() => {
102100
messagesApiEnabled = true
103101
selectedModel = undefined
104102

103+
messagesFlowHandlers.handleWithMessagesApi = handleWithMessagesApi
104+
messagesFlowHandlers.handleWithResponsesApi = handleWithResponsesApi
105+
messagesFlowHandlers.handleWithChatCompletions = handleWithChatCompletions
106+
105107
findEndpointModel.mockClear()
106108
handleWithMessagesApi.mockClear()
107109
handleWithResponsesApi.mockClear()
108110
handleWithChatCompletions.mockClear()
109111
})
110112

113+
afterEach(() => {
114+
messagesFlowHandlers.handleWithMessagesApi =
115+
defaultMessagesFlowHandlers.handleWithMessagesApi
116+
messagesFlowHandlers.handleWithResponsesApi =
117+
defaultMessagesFlowHandlers.handleWithResponsesApi
118+
messagesFlowHandlers.handleWithChatCompletions =
119+
defaultMessagesFlowHandlers.handleWithChatCompletions
120+
})
121+
111122
describe("messages handler orchestration", () => {
112123
test("removes executeCode and rewrites getDiagnostics before forwarding tools", async () => {
113124
selectedModel = {

0 commit comments

Comments
 (0)