Skip to content

Commit 97285ef

Browse files
Refactor file tree truncation functions to pass logger as parameter
🤖 Generated with Codebuff Co-Authored-By: Codebuff <noreply@codebuff.com>
1 parent f6eea04 commit 97285ef

File tree

6 files changed

+58
-22
lines changed

6 files changed

+58
-22
lines changed

backend/src/run-agent-step.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ export const runAgentStep = async (
183183
fileContext,
184184
agentState,
185185
agentTemplates: localAgentTemplates,
186+
logger,
186187
additionalToolDefinitions: () => {
187188
const additionalToolDefinitions = cloneDeep(
188189
Object.fromEntries(
@@ -460,6 +461,7 @@ export const loopAgentSteps = async (
460461
fileContext,
461462
agentState,
462463
agentTemplates: localAgentTemplates,
464+
logger,
463465
additionalToolDefinitions: () => {
464466
const additionalToolDefinitions = cloneDeep(
465467
Object.fromEntries(
@@ -489,6 +491,7 @@ export const loopAgentSteps = async (
489491
fileContext,
490492
agentState,
491493
agentTemplates: localAgentTemplates,
494+
logger,
492495
additionalToolDefinitions: () => {
493496
const additionalToolDefinitions = cloneDeep(
494497
Object.fromEntries(

backend/src/system-prompt/prompts.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { schemaToJsonStr } from '@codebuff/common/util/zod-schema'
1313

1414
import { truncateFileTreeBasedOnTokenBudget } from './truncate-file-tree'
1515

16+
import type { Logger } from '@codebuff/types/logger'
1617
import type { ProjectFileContext } from '@codebuff/common/util/file'
1718

1819
export const configSchemaPrompt = `
@@ -146,16 +147,19 @@ export const additionalSystemPrompts = {
146147
compact: compactPrompt,
147148
} as const
148149

149-
export const getProjectFileTreePrompt = (
150-
fileContext: ProjectFileContext,
151-
fileTreeTokenBudget: number,
152-
mode: 'search' | 'agent',
153-
) => {
150+
export const getProjectFileTreePrompt = (params: {
151+
fileContext: ProjectFileContext
152+
fileTreeTokenBudget: number
153+
mode: 'search' | 'agent'
154+
logger: Logger
155+
}) => {
156+
const { fileContext, fileTreeTokenBudget, mode, logger } = params
154157
const { projectRoot } = fileContext
155-
const { printedTree, truncationLevel } = truncateFileTreeBasedOnTokenBudget(
158+
const { printedTree, truncationLevel } = truncateFileTreeBasedOnTokenBudget({
156159
fileContext,
157-
Math.max(0, fileTreeTokenBudget),
158-
)
160+
tokenBudget: Math.max(0, fileTreeTokenBudget),
161+
logger,
162+
})
159163

160164
const truncationNote =
161165
truncationLevel === 'none'

backend/src/system-prompt/search-system-prompt.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import {
66
getProjectFileTreePrompt,
77
getSystemInfoPrompt,
88
} from './prompts'
9-
import { logger } from '../util/logger'
109
import { countTokens, countTokensJson } from '../util/token-counter'
1110

11+
import type { Logger } from '@codebuff/types/logger'
1212
import type { ProjectFileContext } from '@codebuff/common/util/file'
1313

1414
export function getSearchSystemPrompt(params: {
1515
fileContext: ProjectFileContext
1616
messagesTokens: number
17+
logger: Logger
1718
options: {
1819
agentStepId: string
1920
clientSessionId: string
@@ -22,7 +23,7 @@ export function getSearchSystemPrompt(params: {
2223
userId: string | undefined
2324
}
2425
}): string {
25-
const { fileContext, messagesTokens, options } = params
26+
const { fileContext, messagesTokens, logger, options } = params
2627
const startTime = Date.now()
2728

2829
const maxTokens = 500_000 // costMode === 'lite' ? 64_000 :
@@ -41,17 +42,23 @@ export function getSearchSystemPrompt(params: {
4142
20_000,
4243
) * 20_000
4344

44-
const projectFileTreePrompt = getProjectFileTreePrompt(
45+
const projectFileTreePrompt = getProjectFileTreePrompt({
4546
fileContext,
4647
fileTreeTokenBudget,
47-
'search',
48-
)
48+
mode: 'search',
49+
logger,
50+
})
4951

5052
const t = Date.now()
5153
const truncationBudgets = [5_000, 20_000, 40_000, 100_000, 500_000]
5254
const truncatedTrees = truncationBudgets.reduce(
5355
(acc, budget) => {
54-
acc[budget] = getProjectFileTreePrompt(fileContext, budget, 'search')
56+
acc[budget] = getProjectFileTreePrompt({
57+
fileContext,
58+
fileTreeTokenBudget: budget,
59+
mode: 'search',
60+
logger,
61+
})
5562
return acc
5663
},
5764
{} as Record<number, string>,

backend/src/system-prompt/truncate-file-tree.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import {
44
} from '@codebuff/common/util/file'
55
import { sampleSizeWithSeed } from '@codebuff/common/util/random'
66

7-
import { logger } from '../util/logger'
87
import { countTokens, countTokensJson } from '../util/token-counter'
98

9+
import type { Logger } from '@codebuff/types/logger'
10+
1011
import type {
1112
FileTreeNode,
1213
ProjectFileContext,
@@ -15,14 +16,16 @@ import type {
1516
type TruncationLevel = 'none' | 'unimportant-files' | 'tokens' | 'depth-based'
1617
const DEBUG = false
1718

18-
export const truncateFileTreeBasedOnTokenBudget = (
19-
fileContext: ProjectFileContext,
20-
tokenBudget: number,
21-
): {
19+
export const truncateFileTreeBasedOnTokenBudget = (params: {
20+
fileContext: ProjectFileContext
21+
tokenBudget: number
22+
logger: Logger
23+
}): {
2224
printedTree: string
2325
tokenCount: number
2426
truncationLevel: TruncationLevel
2527
} => {
28+
const { fileContext, tokenBudget, logger } = params
2629
const startTime = performance.now()
2730
const { fileTree, fileTokenScores } = fileContext
2831

@@ -69,6 +72,7 @@ export const truncateFileTreeBasedOnTokenBudget = (
6972
fileTree: filteredTree,
7073
fileTokenScores,
7174
tokenBudget,
75+
logger,
7276
})
7377

7478
if (tokenCount <= tokenBudget) {
@@ -220,8 +224,9 @@ function pruneFileTokenScores(params: {
220224
fileTree: FileTreeNode[]
221225
fileTokenScores: Record<string, Record<string, number>>
222226
tokenBudget: number
227+
logger: Logger
223228
}) {
224-
const { fileTree, fileTokenScores, tokenBudget } = params
229+
const { fileTree, fileTokenScores, tokenBudget, logger } = params
225230
const startTime = performance.now()
226231

227232
// Create sorted array of tokens by score

backend/src/templates/strings.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
} from '../tools/prompts'
1919
import { parseUserMessage } from '../util/messages'
2020

21+
import type { Logger } from '@codebuff/types/logger'
2122
import type { AgentTemplate, PlaceholderValue } from './types'
2223
import type {
2324
AgentState,
@@ -34,6 +35,7 @@ export async function formatPrompt({
3435
agentTemplates,
3536
intitialAgentPrompt,
3637
additionalToolDefinitions,
38+
logger,
3739
}: {
3840
prompt: string
3941
fileContext: ProjectFileContext
@@ -45,6 +47,7 @@ export async function formatPrompt({
4547
additionalToolDefinitions: () => Promise<
4648
ProjectFileContext['customToolDefinitions']
4749
>
50+
logger: Logger
4851
}): Promise<string> {
4952
const { messageHistory } = agentState
5053
const lastUserMessage = messageHistory.findLast(
@@ -66,9 +69,19 @@ export async function formatPrompt({
6669
agentTemplate ? agentTemplate.displayName || 'Unknown Agent' : 'Buffy',
6770
[PLACEHOLDER.CONFIG_SCHEMA]: () => schemaToJsonStr(CodebuffConfigSchema),
6871
[PLACEHOLDER.FILE_TREE_PROMPT_SMALL]: () =>
69-
getProjectFileTreePrompt(fileContext, 2_500, 'agent'),
72+
getProjectFileTreePrompt({
73+
fileContext,
74+
fileTreeTokenBudget: 2_500,
75+
mode: 'agent',
76+
logger,
77+
}),
7078
[PLACEHOLDER.FILE_TREE_PROMPT]: () =>
71-
getProjectFileTreePrompt(fileContext, 10_000, 'agent'),
79+
getProjectFileTreePrompt({
80+
fileContext,
81+
fileTreeTokenBudget: 10_000,
82+
mode: 'agent',
83+
logger,
84+
}),
7285
[PLACEHOLDER.GIT_CHANGES_PROMPT]: () => getGitChangesPrompt(fileContext),
7386
[PLACEHOLDER.REMAINING_STEPS]: () => `${agentState.stepsRemaining!}`,
7487
[PLACEHOLDER.PROJECT_ROOT]: () => fileContext.projectRoot,
@@ -142,6 +155,7 @@ export async function getAgentPrompt<T extends StringField>({
142155
agentState,
143156
agentTemplates,
144157
additionalToolDefinitions,
158+
logger,
145159
}: {
146160
agentTemplate: AgentTemplate
147161
promptType: { type: T }
@@ -151,6 +165,7 @@ export async function getAgentPrompt<T extends StringField>({
151165
additionalToolDefinitions: () => Promise<
152166
ProjectFileContext['customToolDefinitions']
153167
>
168+
logger: Logger
154169
}): Promise<string | undefined> {
155170
let promptValue = agentTemplate[promptType.type]
156171
for (const placeholder of additionalPlaceholders[promptType.type]) {
@@ -171,6 +186,7 @@ export async function getAgentPrompt<T extends StringField>({
171186
spawnableAgents: agentTemplate.spawnableAgents,
172187
agentTemplates,
173188
additionalToolDefinitions,
189+
logger,
174190
})
175191

176192
let addendum = ''

backend/src/tools/handlers/tool/find-files.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export const handleFindFiles = ((params: {
7171
const system = getSearchSystemPrompt({
7272
fileContext,
7373
messagesTokens: fileRequestMessagesTokens,
74+
logger,
7475
options: {
7576
agentStepId,
7677
clientSessionId,

0 commit comments

Comments
 (0)