11import type { InferEntitiesCallerParams } from "@local/hash-isomorphic-utils/ai-inference-types" ;
2+ import type { AccountId , Entity } from "@local/hash-subgraph" ;
23import { proxyActivities } from "@temporalio/workflow" ;
4+ import { CreateEmbeddingResponse } from "openai/resources" ;
35
4- import { createAiActivities } from "./activities" ;
6+ import { createAiActivities , createGraphActivities } from "./activities" ;
57
68const aiActivities = proxyActivities < ReturnType < typeof createAiActivities > > ( {
79 startToCloseTimeout : "1800 second" ,
@@ -10,5 +12,77 @@ const aiActivities = proxyActivities<ReturnType<typeof createAiActivities>>({
1012 } ,
1113} ) ;
1214
15+ const graphActivities = proxyActivities <
16+ ReturnType < typeof createGraphActivities >
17+ > ( {
18+ startToCloseTimeout : "10 second" ,
19+ retry : {
20+ maximumAttempts : 3 ,
21+ } ,
22+ } ) ;
23+
1324export const inferEntities = ( params : InferEntitiesCallerParams ) =>
1425 aiActivities . inferEntitiesActivity ( params ) ;
26+
27+ export const updateEntityEmbeddings = async ( params : {
28+ authentication : {
29+ actorId : AccountId ;
30+ } ;
31+ entity : Entity ;
32+ } ) : Promise < CreateEmbeddingResponse . Usage > => {
33+ const subgraph = await graphActivities . getEntityTypesByQuery ( {
34+ authentication : params . authentication ,
35+ query : {
36+ filter : {
37+ equal : [
38+ { path : [ "versionedUrl" ] } ,
39+ { parameter : params . entity . metadata . entityTypeId } ,
40+ ] ,
41+ } ,
42+ graphResolveDepths : {
43+ inheritsFrom : { outgoing : 255 } ,
44+ constrainsValuesOn : { outgoing : 0 } ,
45+ constrainsPropertiesOn : { outgoing : 1 } ,
46+ constrainsLinksOn : { outgoing : 0 } ,
47+ constrainsLinkDestinationsOn : { outgoing : 0 } ,
48+ isOfType : { outgoing : 0 } ,
49+ hasLeftEntity : { incoming : 0 , outgoing : 0 } ,
50+ hasRightEntity : { incoming : 0 , outgoing : 0 } ,
51+ } ,
52+ temporalAxes : {
53+ pinned : {
54+ axis : "transactionTime" ,
55+ timestamp : null ,
56+ } ,
57+ variable : {
58+ axis : "decisionTime" ,
59+ interval : {
60+ start : null ,
61+ end : null ,
62+ } ,
63+ } ,
64+ } ,
65+ includeDrafts : false ,
66+ } ,
67+ } ) ;
68+ const propertyTypes = await graphActivities . getSubgraphPropertyTypes ( {
69+ subgraph,
70+ } ) ;
71+
72+ const generatedEmbeddings = await aiActivities . createEmbeddingsActivity ( {
73+ entityProperties : params . entity . properties ,
74+ propertyTypes,
75+ } ) ;
76+
77+ if ( generatedEmbeddings . embeddings . length > 0 ) {
78+ await graphActivities . updateEntityEmbeddings ( {
79+ authentication : params . authentication ,
80+ embeddings : generatedEmbeddings . embeddings . map ( ( embedding ) => ( {
81+ ...embedding ,
82+ entityId : params . entity . metadata . recordId . entityId ,
83+ } ) ) ,
84+ } ) ;
85+ }
86+
87+ return generatedEmbeddings . usage ;
88+ } ;
0 commit comments