From 2e698f52fee8afef887b7a369b3cf8e6cb3b15eb Mon Sep 17 00:00:00 2001 From: Griffin Tarpenning Date: Fri, 17 Jan 2025 11:04:35 -0800 Subject: [PATCH] chore(ui): a better "use" tab experience for annotation specs (#3404) --- .../pages/ObjectsPage/ObjectVersionPage.tsx | 8 ++ .../ObjectsPage/Tabs/TabUseAnnotationSpec.tsx | 114 ++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx index 601af6eaf0b2..d4702509c0dc 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx @@ -44,6 +44,7 @@ import { } from '../wfReactInterface/wfDataModelHooksInterface'; import {DeleteObjectButtonWithModal} from './ObjectDeleteButtons'; import {TabPrompt} from './Tabs/TabPrompt'; +import {TabUseAnnotationSpec} from './Tabs/TabUseAnnotationSpec'; import {TabUseModel} from './Tabs/TabUseModel'; import {TabUseObject} from './Tabs/TabUseObject'; @@ -394,6 +395,13 @@ const ObjectVersionPageInner: React.FC<{ uri={refUri} projectName={projectName} /> + ) : baseObjectClass === 'AnnotationSpec' ? ( + ) : ( )} diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx new file mode 100644 index 000000000000..95b442bff91d --- /dev/null +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx @@ -0,0 +1,114 @@ +import {Box} from '@material-ui/core'; +import {CopyableText} from '@wandb/weave/components/CopyableText'; +import {isValidVarName} from '@wandb/weave/core/util/var'; +import {abbreviateRef} from '@wandb/weave/util/refs'; +import React from 'react'; + +import {DocLink} from '../../common/Links'; +import {TabUseBanner} from '../../common/TabUseBanner'; +import {AnnotationSpec} from '../../wfReactInterface/generatedBuiltinObjectClasses.zod'; + +type TabUseAnnotationSpecProps = { + name: string; + uri: string; + projectName: string; + data?: AnnotationSpec; +}; + +export const TabUseAnnotationSpec = ({ + name, + uri, + projectName, + data, +}: TabUseAnnotationSpecProps) => { + const fullSpecName = `wandb.annotation.${name}`; + const pythonName = isValidVarName(name) ? name : 'annotation_spec'; + const payloadValue = makeAnnotationPayloadFromSpec(data?.field_schema); + const abbreviatedAnnotationCode = makeAnnotateCallCode( + abbreviateRef(uri), + payloadValue, + fullSpecName, + projectName + ); + const fullAnnotationCode = makeAnnotateCallCode( + uri, + payloadValue, + fullSpecName, + projectName + ); + + return ( + + + See{' '} + {' '} + for more information. + + + + The ref for this annotation is: + + + + Use the following code to retrieve this annotation spec: + + + + Use the following code to annotate calls with this annotation spec: + + + + ); +}; + +const makeAnnotateCallCode = ( + uri: string, + payloadValue: string, + fullSpecName: string, + projectName: string +) => `client = weave.init('${projectName}') + +call = client.get_calls()[0] +call.feedback.add( + feedback_type='${fullSpecName}', + payload={"value": ${payloadValue}}, + annotation_ref='${uri}' +)`; + +const makeAnnotationPayloadFromSpec = ( + spec?: AnnotationSpec['field_schema'] +): string => { + if (spec?.type === 'string') { + if (spec.enum) { + return `"${spec.enum[0] ?? 'Yes'}"`; + } + const strMsg = 'A great call!'; + if ( + !spec.max_length || + (spec.max_length && spec.max_length >= strMsg.length) + ) { + return `"${strMsg}"`; + } + return '"Nice!"'; + } + if (spec?.type === 'number' || spec?.type === 'integer') { + return `${spec.maximum ?? spec.minimum ?? 10}`; + } + if (spec?.type === 'boolean') { + return 'True'; + } + return '"Nice!"'; +};