126 lines
3.3 KiB
TypeScript
126 lines
3.3 KiB
TypeScript
import { makeAutoObservable } from 'mobx';
|
|
import { SxProps } from '@mui/material';
|
|
import { INodeBase } from './base';
|
|
import { PlanManager } from './manager';
|
|
import { IApiAgentAction } from '@/apis/generate-base-plan';
|
|
|
|
export enum ActionType {
|
|
Propose = 'Propose',
|
|
Critique = 'Critique',
|
|
Improve = 'Improve',
|
|
Finalize = 'Finalize',
|
|
}
|
|
|
|
export const getActionTypeDisplayText = (actionType: ActionType | string): string => {
|
|
const displayMap: Record<string, string> = {
|
|
[ActionType.Propose]: '提议',
|
|
[ActionType.Critique]: '评审',
|
|
[ActionType.Improve]: '改进',
|
|
[ActionType.Finalize]: '总结',
|
|
};
|
|
|
|
return displayMap[actionType] || actionType;
|
|
};
|
|
|
|
const AgentActionStyles = new Map<ActionType | '', SxProps>([
|
|
[ActionType.Propose, { backgroundColor: '#B9EBF9', borderColor: '#94c2dc' }],
|
|
[ActionType.Critique, { backgroundColor: '#EFF9B9', borderColor: '#c0dc94' }],
|
|
[ActionType.Improve, { backgroundColor: '#E0DEFC', borderColor: '#bbb8e5' }],
|
|
[ActionType.Finalize, { backgroundColor: '#F9C7B9', borderColor: '#dc9e94' }],
|
|
['', { backgroundColor: '#000000', borderColor: '#000000' }],
|
|
]);
|
|
|
|
export const getAgentActionStyle = (action: ActionType): SxProps => {
|
|
return AgentActionStyles.get(action) ?? AgentActionStyles.get('')!;
|
|
};
|
|
|
|
export interface IRichSentence {
|
|
who: string;
|
|
whoStyle: SxProps;
|
|
content: string;
|
|
style: SxProps;
|
|
}
|
|
|
|
export class AgentActionNode implements INodeBase {
|
|
public name: string = '';
|
|
|
|
public plan: PlanManager;
|
|
|
|
public type: ActionType = ActionType.Propose;
|
|
|
|
public agent: string = '';
|
|
|
|
public description: string = '';
|
|
|
|
public inputs: string[] = [];
|
|
|
|
public path: string[] = []; // ['A', 'B']
|
|
|
|
public children: string[] = []; // ['D', 'E']
|
|
|
|
public get id() {
|
|
return this.path[this.path.length - 1];
|
|
}
|
|
|
|
public get parent() {
|
|
return this.path[this.path.length - 2];
|
|
}
|
|
|
|
public get last() {
|
|
return this.plan.agentActionMap.get(this.parent);
|
|
}
|
|
|
|
public get renderCard(): IRichSentence {
|
|
const style = getAgentActionStyle(this.type);
|
|
return {
|
|
who: this.agent,
|
|
whoStyle: style,
|
|
// this.description 首字母小写
|
|
content: this.description[0].toLowerCase() + this.description.slice(1),
|
|
style: { ...style, backgroundColor: 'transparent' },
|
|
};
|
|
}
|
|
|
|
public get apiAgentAction(): IApiAgentAction {
|
|
return {
|
|
id: this.name,
|
|
type: this.type,
|
|
agent: this.agent,
|
|
description: this.description,
|
|
inputs: this.inputs,
|
|
};
|
|
}
|
|
|
|
public get belongingSelection() {
|
|
return this.plan.agentSelectionMap.get(
|
|
this.plan.actionSelectionMap.get(this.id) ?? '',
|
|
);
|
|
}
|
|
|
|
constructor(plan: PlanManager, json?: any) {
|
|
this.plan = plan;
|
|
if (json) {
|
|
this.name = json.name ?? '';
|
|
this.agent = json.agent ?? '';
|
|
this.description = json.description ?? '';
|
|
this.inputs = [...(json.inputs ?? [])];
|
|
this.type = json.type ?? ActionType.Propose;
|
|
this.path = [...(json.path ?? [])];
|
|
this.children = [...(json.children ?? [])];
|
|
}
|
|
makeAutoObservable(this);
|
|
}
|
|
|
|
public dump() {
|
|
return {
|
|
name: this.name,
|
|
agent: this.agent,
|
|
description: this.description,
|
|
inputs: [...this.inputs],
|
|
type: this.type,
|
|
path: [...this.path],
|
|
children: [...this.children],
|
|
};
|
|
}
|
|
}
|