1
0
Fork 0

get prompt menu sort of working
Run Docker Build / build (push) Successful in 17s Details
Run Python Build / build (push) Successful in 27s Details

This commit is contained in:
Sean Sube 2024-06-02 16:42:47 -05:00
parent fec907ec8f
commit a9705727f0
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
5 changed files with 51 additions and 14 deletions

View File

@ -255,7 +255,7 @@ export function PromptEventItem(props: EventItemProps) {
return <ListItem alignItems="flex-start" ref={props.focusRef}>
<ListItemAvatar>
<Avatar>{character.substring(0, 1)}</Avatar>
<Avatar>{character.name.substring(0, 1)}</Avatar>
</ListItemAvatar>
<ListItemText
primary="Prompt"
@ -268,7 +268,7 @@ export function PromptEventItem(props: EventItemProps) {
variant="body2"
color="text.primary"
>
Prompt for {character}: {prompt}
Prompt for {character.name}: {prompt}
</Typography>
}
/>

View File

@ -55,6 +55,11 @@ export interface World {
//
export interface BooleanParameter {
type: 'boolean';
default?: boolean;
}
export interface StringParameter {
type: 'string';
default?: string;
@ -63,11 +68,11 @@ export interface StringParameter {
export interface NumberParameter {
type: 'number';
default?: string;
default?: number;
enum?: Array<string>;
}
export type Parameter = NumberParameter | StringParameter;
export type Parameter = BooleanParameter | NumberParameter | StringParameter;
export interface Action {
type: 'function';

View File

@ -1,19 +1,22 @@
import { Maybe, doesExist, mustDefault, mustExist } from '@apextoaster/js-utils';
import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Divider, MenuItem, Stack, Switch, TextField } from '@mui/material';
import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Divider, FormControlLabel, MenuItem, Stack, Switch, TextField } from '@mui/material';
import React from 'react';
import { useStore } from 'zustand';
import { World, NumberParameter, StringParameter, Parameter, Action } from './models';
import { World, BooleanParameter, NumberParameter, StringParameter, Parameter, Action } from './models';
import { StoreState, store } from './store';
// region parameter components
export interface BooleanParameterProps {
name: string;
parameter: BooleanParameter;
setParameter: (value: boolean) => void;
}
export function BooleanParameter(props: BooleanParameterProps) {
return <Switch />;
export function BooleanParameterItem(props: BooleanParameterProps) {
const { name, setParameter } = props;
return <FormControlLabel control={<Switch onChange={(event) => setParameter(event.target.checked)} />} label={name} />;
}
export function EnumParameterItem(props: NumberParameterProps | StringParameterProps) {
@ -127,6 +130,10 @@ export function enumerateSignificantParameterValues(name: string, world: World)
}
export function convertSignificantParameter(name: string, parameter: Parameter, world: Maybe<World>): Parameter {
if (parameter.type === 'boolean') {
return parameter;
}
if (doesExist(world) && SIGNIFICANT_PARAMETERS.includes(name)) {
return {
...parameter,
@ -143,10 +150,25 @@ export function selectWorld(state: StoreState) {
};
}
export function formatAction(action: string, parameters: Record<string, number | string>) {
export function formatAction(action: string, parameters: Record<string, boolean | number | string>) {
return `~${action}:${Object.entries(parameters).map(([name, value]) => `${name}=${value}`).join(',')}`;
}
export function makeDefaultParameterValues(parameters: Record<string, Parameter>) {
return Object.entries(parameters).reduce((acc, [name, parameter]) => {
switch (parameter.type) {
case 'boolean':
return { ...acc, [name]: mustDefault(parameter.default, false) };
case 'number':
return { ...acc, [name]: mustDefault(parameter.default, 0) };
case 'string':
return { ...acc, [name]: mustDefault(parameter.default, '') };
default:
return acc;
}
}, {} as Record<string, boolean | number | string>);
}
export interface PromptActionProps {
action: Action;
@ -157,10 +179,11 @@ export function PromptAction(props: PromptActionProps) {
const { action, setAction } = props;
const { world } = useStore(store, selectWorld);
const [parameterValues, setParameterValues] = React.useState<Record<string, number | string>>({});
// initialize with default values
const [parameterValues, setParameterValues] = React.useState(makeDefaultParameterValues(action.function.parameters.properties));
// create an input for each parameter
const inputs = Object.entries(action.function.parameters.properties).map(([name, parameter]) => {
const inputs = Object.entries(action.function.parameters.properties).filter(([name, _parameter]) => name !== 'unused').map(([name, parameter]) => {
const convertedParameter = convertSignificantParameter(name, parameter, world);
switch (convertedParameter.type) {
@ -172,6 +195,10 @@ export function PromptAction(props: PromptActionProps) {
return <NumberParameterItem name={name} parameter={convertedParameter as NumberParameter} setParameter={(value) => {
setParameterValues((old) => ({ ...old, [name]: value }));
}} />;
case 'boolean':
return <BooleanParameterItem name={name} parameter={convertedParameter as BooleanParameter} setParameter={(value) => {
setParameterValues((old) => ({ ...old, [name]: value }));
}} />;
default:
return <UnknownParameter name={name} />;
}

View File

@ -201,7 +201,7 @@ class RemotePlayer(BasePlayer):
formatted_prompt = prompt.format(**kwargs)
if toolbox:
actions = toolbox.list_definitions()
formatted_prompt += self.format_psuedo_functions(toolbox)
# formatted_prompt += self.format_psuedo_functions(toolbox)
self.memory.append(HumanMessage(content=formatted_prompt))

View File

@ -68,7 +68,8 @@ async def handler(websocket):
"character": event.character,
"prompt": event.prompt,
"actions": event.actions,
}
},
default=server_json,
),
)
@ -288,7 +289,11 @@ socket_thread = None
def server_json(obj):
if isinstance(obj, WorldEntity):
return obj.name
return {
"id": obj.id,
"name": obj.name,
"type": obj.type,
}
return world_json(obj)