File size: 2,754 Bytes
abcf568 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import { InMemoryStudioEventBus } from '../../../events/event-bus'
import { createStudioUserMessage } from '../../../domain/factories'
import { logPlotStudioTiming, readElapsedMs } from '../../../observability/plot-studio-timing'
import { buildDraftAssistantMessage } from '../session-runner-helpers'
import { buildStudioWorkContext } from '../work-context'
import type { StudioSession, StudioWorkContext } from '../../../domain/types'
import type {
StudioPreparedRunContext,
StudioRunRequestInput,
StudioSessionRunnerDependencies
} from './dependency-center'
import { hasUsableCustomApiConfig } from './factory'
export async function buildWorkContext(
deps: Pick<StudioSessionRunnerDependencies, 'workStore' | 'workResultStore' | 'taskStore' | 'sessionEventStore'>,
input: {
session: StudioSession
inputText: string
},
): Promise<StudioWorkContext> {
const draftAssistantMessage = buildDraftAssistantMessage(input.session)
const workContext = await buildStudioWorkContext({
sessionId: input.session.id,
agent: input.session.agentType,
assistantMessage: draftAssistantMessage,
workStore: deps.workStore,
workResultStore: deps.workResultStore,
taskStore: deps.taskStore,
sessionEventStore: deps.sessionEventStore
})
return workContext ?? {
sessionId: input.session.id,
agent: input.session.agentType
}
}
export async function prepareRun(
deps: StudioSessionRunnerDependencies,
input: StudioRunRequestInput,
): Promise<StudioPreparedRunContext> {
const prepareStartedAt = Date.now()
const workContext = await deps.buildWorkContext(input)
const run = deps.createRun(input.session, input.inputText, input.runMetadata)
const persistedRun = deps.runStore ? await deps.runStore.create(run) : run
await deps.messageStore.createUserMessage(createStudioUserMessage({
sessionId: input.session.id,
text: input.inputText
}))
const assistantMessage = await deps.createAssistantMessage(input.session, persistedRun.id)
const eventBus = deps.sharedEventBus ?? new InMemoryStudioEventBus()
logPlotStudioTiming(input.session.studioKind, 'run.started', {
sessionId: input.session.id,
runId: persistedRun.id,
assistantMessageId: assistantMessage.id,
prepareDurationMs: readElapsedMs(prepareStartedAt),
hasCustomApiConfig: hasUsableCustomApiConfig(input.customApiConfig),
})
const runningRun = deps.runStore
? await deps.runStore.update(persistedRun.id, { status: 'running' }) ?? { ...persistedRun, status: 'running' }
: { ...persistedRun, status: 'running' as const }
eventBus.publish({
type: 'run_updated',
run: runningRun
})
return {
input,
workContext,
run: runningRun,
assistantMessage,
eventBus
}
}
|