Skip to content

Commit 27abd17

Browse files
committed
Small refactoring suggested by codebuff
1 parent 28be9bd commit 27abd17

File tree

3 files changed

+75
-62
lines changed

3 files changed

+75
-62
lines changed

backend/src/run-agent-step.ts

Lines changed: 3 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ import { additionalSystemPrompts } from './system-prompt/prompts'
1515
import { getAgentTemplate } from './templates/agent-registry'
1616
import { getAgentPrompt } from './templates/strings'
1717
import { processStreamWithTools } from './tools/stream-parser'
18+
import { getAgentOutput } from './util/agent-output'
1819
import {
1920
asSystemInstruction,
2021
asSystemMessage,
21-
asUserMessage,
22+
buildUserMessageContent,
2223
messagesWithSystem,
2324
expireMessages,
2425
} from './util/messages'
@@ -52,29 +53,7 @@ import type {
5253
import type { ProjectFileContext } from '@codebuff/common/util/file'
5354
import type { WebSocket } from 'ws'
5455

55-
/**
56-
* Combines prompt, params, and content into a unified message content structure
57-
*/
58-
function buildUserMessageContent(
59-
prompt: string | undefined,
60-
params: Record<string, any> | undefined,
61-
content?: Array<TextPart | ImagePart>,
62-
): string | Array<TextPart | ImagePart> {
63-
// If we have content, return it as-is (client should have already combined prompt + content)
64-
if (content && content.length > 0) {
65-
if (content.length === 1 && content[0].type === 'text') {
66-
return asUserMessage(content[0].text)
67-
}
68-
return content
69-
}
7056

71-
// Only prompt/params, combine and return as simple text
72-
const textParts = buildArray([
73-
prompt,
74-
params && JSON.stringify(params, null, 2),
75-
])
76-
return asUserMessage(textParts.join('\n\n'))
77-
}
7857

7958
export const runAgentStep = async (
8059
params: {
@@ -789,42 +768,4 @@ export const loopAgentSteps = async (
789768
}
790769
}
791770

792-
function getAgentOutput(
793-
agentState: AgentState,
794-
agentTemplate: AgentTemplate,
795-
): AgentOutput {
796-
if (agentTemplate.outputMode === 'structured_output') {
797-
return {
798-
type: 'structuredOutput',
799-
value: agentState.output ?? null,
800-
}
801-
}
802-
if (agentTemplate.outputMode === 'last_message') {
803-
const assistantMessages = agentState.messageHistory.filter(
804-
(message): message is AssistantMessage => message.role === 'assistant',
805-
)
806-
const lastAssistantMessage = assistantMessages[assistantMessages.length - 1]
807-
if (!lastAssistantMessage) {
808-
return {
809-
type: 'error',
810-
message: 'No response from agent',
811-
}
812-
}
813-
return {
814-
type: 'lastMessage',
815-
value: lastAssistantMessage.content,
816-
}
817-
}
818-
if (agentTemplate.outputMode === 'all_messages') {
819-
// Remove the first message, which includes the previous conversation history.
820-
const agentMessages = agentState.messageHistory.slice(1)
821-
return {
822-
type: 'allMessages',
823-
value: agentMessages,
824-
}
825-
}
826-
agentTemplate.outputMode satisfies never
827-
throw new Error(
828-
`Unknown output mode: ${'outputMode' in agentTemplate ? agentTemplate.outputMode : 'undefined'}`,
829-
)
830-
}
771+

backend/src/util/agent-output.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import type { AgentTemplate } from '@codebuff/common/types/agent-template'
2+
import type { AssistantMessage } from '@codebuff/common/types/messages/codebuff-message'
3+
import type { AgentState, AgentOutput } from '@codebuff/common/types/session-state'
4+
5+
export function getAgentOutput(
6+
agentState: AgentState,
7+
agentTemplate: AgentTemplate,
8+
): AgentOutput {
9+
if (agentTemplate.outputMode === 'structured_output') {
10+
return {
11+
type: 'structuredOutput',
12+
value: agentState.output ?? null,
13+
}
14+
}
15+
if (agentTemplate.outputMode === 'last_message') {
16+
const assistantMessages = agentState.messageHistory.filter(
17+
(message): message is AssistantMessage => message.role === 'assistant',
18+
)
19+
const lastAssistantMessage = assistantMessages[assistantMessages.length - 1]
20+
if (!lastAssistantMessage) {
21+
return {
22+
type: 'error',
23+
message: 'No response from agent',
24+
}
25+
}
26+
return {
27+
type: 'lastMessage',
28+
value: lastAssistantMessage.content,
29+
}
30+
}
31+
if (agentTemplate.outputMode === 'all_messages') {
32+
// Remove the first message, which includes the previous conversation history.
33+
const agentMessages = agentState.messageHistory.slice(1)
34+
return {
35+
type: 'allMessages',
36+
value: agentMessages,
37+
}
38+
}
39+
agentTemplate.outputMode satisfies never
40+
throw new Error(
41+
`Unknown output mode: ${'outputMode' in agentTemplate ? agentTemplate.outputMode : 'undefined'}`,
42+
)
43+
}

backend/src/util/messages.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import type {
1717
Message,
1818
ToolMessage,
1919
} from '@codebuff/common/types/messages/codebuff-message'
20+
import type {
21+
TextPart,
22+
ImagePart,
23+
} from '@codebuff/common/types/messages/content-part'
2024
import type { Logger } from '@codebuff/common/types/contracts/logger'
2125

2226
export function messagesWithSystem(params: {
@@ -39,6 +43,31 @@ export function messagesWithSystem(params: {
3943
export function asUserMessage(str: string): string {
4044
return `<user_message>${str}${closeXml('user_message')}`
4145
}
46+
47+
/**
48+
* Combines prompt, params, and content into a unified message content structure
49+
*/
50+
export function buildUserMessageContent(
51+
prompt: string | undefined,
52+
params: Record<string, any> | undefined,
53+
content?: Array<TextPart | ImagePart>,
54+
): string | Array<TextPart | ImagePart> {
55+
// If we have content, return it as-is (client should have already combined prompt + content)
56+
if (content && content.length > 0) {
57+
if (content.length === 1 && content[0].type === 'text') {
58+
return asUserMessage(content[0].text)
59+
}
60+
return content
61+
}
62+
63+
// Only prompt/params, combine and return as simple text
64+
const textParts = buildArray([
65+
prompt,
66+
params && JSON.stringify(params, null, 2),
67+
])
68+
return asUserMessage(textParts.join('\n\n'))
69+
}
70+
4271
export function parseUserMessage(str: string): string | undefined {
4372
const match = str.match(/<user_message>(.*?)<\/user_message>/s)
4473
return match ? match[1] : undefined

0 commit comments

Comments
 (0)