-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathstate.ts
71 lines (61 loc) · 1.66 KB
/
state.ts
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
import s from 'dedent'
import { AgentName } from './agent.js'
import { Conversation, Request, Response, user } from './messages.js'
import { Workflow } from './workflow.js'
type WorkflowStateOptions = {
agent: string
messages: Conversation
status?: 'idle' | 'running' | 'paused' | 'finished' | 'failed'
children?: WorkflowState[]
}
export const childState = (options: WorkflowStateOptions): WorkflowState => {
const { status = 'idle', messages, agent, children = [] } = options
return {
status,
messages,
agent,
children,
}
}
export const rootState = (workflow: Workflow): WorkflowState =>
childState({
agent: 'supervisor',
messages: [
user(s`
Here is description of my workflow:
<workflow>
${workflow.description}
Create ${workflow.output}
</workflow>
Here is all the knowledge available:
<knowledge>${workflow.knowledge}</knowledge>
`),
],
})
export type WorkflowState = Required<WorkflowStateOptions>
export const finish = (state: WorkflowState, response: Response): WorkflowState => {
return {
...state,
status: 'finished',
messages: [state.messages[0], response],
}
}
type DelegationRequest = [AgentName, Request]
export const delegate = (state: WorkflowState, requests: DelegationRequest[]): WorkflowState => {
return {
...state,
status: 'running',
children: requests.map(([agent, request]) =>
childState({
agent,
messages: [request],
})
),
}
}
export const handoff = (state: WorkflowState, agent: AgentName): WorkflowState => {
return childState({
agent,
messages: state.messages,
})
}