1
1
import crud from '@cocreate/crud-client'
2
2
import Actions from '@cocreate/actions'
3
+ import { queryElements } from '@cocreate/utils' ;
3
4
4
5
const model = 'gpt-4-1106-preview'
5
6
const max_tokens = 3300 ;
@@ -9,57 +10,7 @@ const stop = '###STOP###';
9
10
10
11
const forms = new Map ( )
11
12
12
- const componentsReference = {
13
- "componentsReference" : {
14
- "socket" : {
15
- "functions" : {
16
- "send" : "<data>" ,
17
- "listen" : "<method>"
18
- } ,
19
- "data" : { 'broadcast' : 'boolean' , 'broadcast-sender' : 'boolean' , 'broadcast-browser' : 'boolean' } ,
20
- "html-attributes" : [ 'broadcast' , 'broadcast-sender' , 'broadcast-browser' , 'namespace' , 'room' , 'balancer' ]
21
- } ,
22
- "crud" : {
23
- "functions" : {
24
- "send" : "<data>" ,
25
- "listen" : "<method>"
26
- } ,
27
- "methods" : [ "database.create" , "database.read" , "database.update" , "database.delete" , "array.create" , "array.read" , "array.update" , "array.delete" , "index.create" , "index.read" , "index.update" , "index.delete" , "object.create" , "object.read" , "object.update" , "object.delete" ] ,
28
- "data" : { method : "" , database : "" , array : "" , index : "" , object : { } || [ ] , filter : { } } ,
29
- "html-attributes" : [ 'storage' , 'database' , 'array' , 'object' , 'key' , 'index' , 'save' , 'read' , 'update' , 'delete' , 'realtime' , 'crud' , 'upsert' , 'value-type' , 'value-prefix' , 'value-suffix' ]
30
- } ,
31
- "filter" : {
32
- "functions" : {
33
- "getFilter" : "<filter>" ,
34
- "setFilter" : "<filter>"
35
- } ,
36
- "filter" : { query : [ { key : "" , value : "" , operator : "$eq | $ne | $includes" , logicalOperator : "" , caseSensitive : "true | false" } ] , sort : [ { key : "" , direction : "asc | desc" } ] , search : [ { value : "" , operator : "" , caseSensitive : "true | false" } ] } ,
37
- "html-attributes" : [ 'filter-selector' , 'filter-closest' , 'filter-parent' , 'filter-prvious' , 'filter-next' , 'filter-key' , 'filter-value' , 'filter-value-type' , 'filter-case-sensitive' , 'filter-operator' , 'filter-logical-opertor' , 'filter-sort-key' , 'filter-sort-direction' , 'filter-search' , 'filter-limit' , 'filter-count' , 'filter-on' ]
38
- } ,
39
- "crdt" : {
40
- "functions" : [ "init" , "getText" , "updateText" , "replaceText" , "undoText" , "redoText" ] ,
41
- "data" : { array : "" , object : "_id" , key : "" , value : "" , attribute : "bold | italic" , start : 0 , length : 0 } ,
42
- "html-attributes" : [ 'crdt' ]
43
- } ,
44
- "cursors" : {
45
- "functions" : { sendPosition : "<data>" } ,
46
- "data" : { array : [ ] , object : "_id" , key : "" , start : 0 , end : 0 } ,
47
- "html-attributes" : [ 'cursors' ]
48
- } ,
49
- "events" : {
50
- "functions" : { init : "<data>" } ,
51
- "data" : { prefix : "" , events : [ ] } ,
52
- "predefined-prefixes" : [ 'click' , 'change' , 'input' , 'onload' , 'observer' , 'mousedown' , 'mousemove' , 'mouseup' , 'toggle' , 'hover' , 'selected' ] ,
53
- "html-attributes" : [ '<prefix>-selector' , '<prefix>-selector' , '<prefix>-closest' , '<prefix>-parent' , '<prefix>-previous' , '<prefix>-next' ]
54
- } ,
55
- "state" : {
56
- "html-attributes" : [ 'state_to' , 'state_id' , 'state-<attribute>' , 'state-overwrite' ]
57
- } ,
58
- }
59
-
60
- } ;
61
-
62
- async function send ( conversation ) {
13
+ async function send ( conversation , action ) {
63
14
try {
64
15
let data = await crud . socket . send ( {
65
16
method : 'openai.chat.completions.create' ,
@@ -75,13 +26,30 @@ async function send(conversation) {
75
26
76
27
if ( data ) {
77
28
let content = data . openai . choices [ 0 ] . message . content ;
78
- content = content . replace ( / ` ` ` j s o n \n | \n ` ` ` / g, '' ) ;
79
- content = JSON . parse ( content )
80
29
81
- // TODO: check if careers exist else create
82
- let responseElement = document . querySelector ( '[openai="response"]' )
83
- if ( responseElement ) {
84
- responseElement . setValue ( content )
30
+ let valueType = action . element . getAttribute ( 'openai-value-type' ) ;
31
+ content = parseContent ( content , valueType )
32
+ let elements = queryElements ( { element : action . element , prefix : 'openai' } ) ;
33
+
34
+
35
+
36
+ let type = action . element . getAttribute ( 'openai-type' ) ;
37
+ if ( type === 'form' ) {
38
+ if ( typeof content !== "object" )
39
+ return
40
+ for ( let form of elements ) {
41
+ const inputs = form . querySelectorAll ( '[name], [key]' ) ;
42
+ inputs . forEach ( element => {
43
+ const key = element . getAttribute ( 'key' ) || element . getAttribute ( 'name' ) ;
44
+ if ( content [ key ] ) {
45
+ element . setValue ( content [ key ] ) ;
46
+ }
47
+ } ) ;
48
+ }
49
+ } else {
50
+ for ( let element of elements ) {
51
+ element . setValue ( content )
52
+ }
85
53
}
86
54
}
87
55
@@ -105,6 +73,31 @@ async function send(conversation) {
105
73
106
74
}
107
75
76
+ function parseContent ( content , valueType ) {
77
+ let parsedContent ;
78
+
79
+ if ( valueType === 'json' ) {
80
+ content = content . replace ( / ` ` ` j s o n \n | \n ` ` ` / g, '' ) ;
81
+ parsedContent = JSON . parse ( content ) ;
82
+ } else if ( valueType === 'javascript' ) {
83
+ content = content . replace ( / ` ` ` j a v a s c r i p t \n | \n ` ` ` / g, '' ) ;
84
+ parsedContent = content ;
85
+ } else if ( valueType === 'html' ) {
86
+ content = content . replace ( / ` ` ` h t m l \n | \n ` ` ` / g, '' ) ;
87
+ parsedContent = content ;
88
+ } else if ( valueType === 'css' ) {
89
+ content = content . replace ( / ` ` ` c s s \n | \n ` ` ` / g, '' ) ;
90
+ parsedContent = content ;
91
+ } else if ( valueType === 'markdown' ) {
92
+ parsedContent = content ;
93
+ } else {
94
+ // Default case to handle any other types or plain text
95
+ parsedContent = content ;
96
+ }
97
+
98
+ return parsedContent ;
99
+ }
100
+
108
101
// Function to extract the object from the generated code
109
102
function extractObjectFromCode ( code ) {
110
103
try {
@@ -121,85 +114,16 @@ function extractObjectFromCode(code) {
121
114
}
122
115
}
123
116
124
- async function openaiAction ( form ) {
117
+ async function openaiAction ( action ) {
118
+ let form = action . form
119
+ if ( ! form )
120
+ return
121
+
125
122
let elements = form . querySelectorAll ( '[openai]' )
126
123
127
124
let conversation = forms . get ( form )
128
- // if (!conversation) {
129
- // const crudReference = {
130
- // data: {
131
- // method: "database.create | database.read | database.update | database.delete | array.create | array.read | array.update | array.delete | index.create | index.read | index.update | index.delete | object.create | object.read | object.update | object.delete",
132
- // storage: "" || [""],
133
- // database: "" || [""],
134
- // array: "" || [""],
135
- // index: "" || [""],
136
- // object: {} || [{}],
137
- // filter: {
138
- // query: [{ key: "", value: "", operator: "$eq | $ne | $includes", logicalOperator: "", caseSensitive: "true | false" }],
139
- // sort: [{ key: "", direction: "asc | desc" }],
140
- // search: [{ value: "", operator: "", caseSensitive: "true | false" }]
141
- // }
142
- // }
143
- // }
144
- // const crudObjectReference = {
145
- // data: {
146
- // method: " object.create | object.read | object.update | object.delete",
147
- // array: "" || [""],
148
- // object: {} || [{}],
149
- // filter: {
150
- // query: [{ key: "", value: "", operator: "$eq | $ne | $includes", logicalOperator: "", caseSensitive: "true | false" }],
151
- // sort: [{ key: "", direction: "asc | desc" }],
152
- // search: [{ value: "", operator: "", caseSensitive: "true | false" }],
153
- // limit: 0
154
- // }
155
- // }
156
- // }
157
-
158
- // const filterObjectReference = {
159
- // data: {
160
- // method: " object.create | object.read | object.update | object.delete",
161
- // array: "files",
162
- // object: [{
163
- // "_id": "",
164
- // "name": "",
165
- // "src": "",
166
- // "host": [
167
- // "*",
168
- // ],
169
- // "directory": "/",
170
- // "path": "",
171
- // "content-type": "",
172
- // "public": "true"
173
- // }]
174
- // }
175
- // }
176
-
177
- // const htmlAttributesReference = {
178
- // "socket-html-attributes": ['broadcast', 'broadcast-sender', 'broadcast-browser', 'namespace', 'room', 'balancer'],
179
- // "crud-html-attributes": ['storage', 'database', 'array', 'object', 'key', 'index', 'save', 'read', 'update', 'delete', 'realtime', 'crud', 'upsert', 'value-type', 'value-prefix', 'value-suffix', 'listen'],
180
- // "filter-html-attributes": ['filter-selector', 'filter-closest', 'filter-parent', 'filter-previous', 'filter-next', 'filter-key', 'filter-value', 'filter-value-type', 'filter-case-sensitive', 'filter-operator', 'filter-logical-opertor', 'filter-sort-key', 'filter-sort-direction', 'filter-search', 'filter-limit', 'filter-count', 'filter-on'],
181
- // "render-html-attributes": ['render', 'render-selector', 'render-closest', 'render-parent', 'render-previous', 'render-next', 'render-as']
182
- // }
183
-
184
- // conversation = [
185
- // { role: 'system', content: 'If the users request seem to want to perform a CRUD operation, return a CoCreateJS CRUD data object as a response. Else reply as best you can to users queries' },
186
- // { role: 'system', content: 'data.method should default to "object.create", "object.read", "object.update", "object.delete"' },
187
- // { role: 'system', content: 'To perform CRUD operations on the objects contained within an array, use the following methods: "object.create" for creating objects, "object.read" for reading and returning one or more objects, "object.update" for updating objects, and "object.delete" for deleting objects. The array property must be defined to perform crud operations on objects' },
188
- // { role: 'system', content: 'data.storage and data.database is not required and should only be defined if the user specifically requests it. example: delete test database from indexeddb storage' },
189
- // { role: 'system', content: 'In the context of CoCreateJS, an "array" corresponds to a "table" in SQL databases or a "collection" in NoSQL databases.' },
190
- // { role: 'system', content: 'In the context of CoCreateJS, an "object" corresponds to a "row" in SQL databases or a "document" in NoSQL databases.' },
191
- // { role: 'system', content: 'crud reference' + JSON.stringify(crudReference) },
192
- // { role: 'system', content: 'crud object reference' + JSON.stringify(crudObjectReference) },
193
- // { role: 'system', content: 'When using object.update or object.delete methods the data.object._id should be defined or a filter used to return and excute on matches' },
194
- // { role: 'system', content: 'file object reference' + JSON.stringify(filterObjectReference) },
195
- // { role: 'system', content: 'If the users request seem to want to create a file or code return the code/source in the data.object.src . This will make the file available over network request using the defined path' },
196
- // { role: 'system', content: 'html attributes reference' + JSON.stringify(htmlAttributesReference) },
197
- // { role: 'system', content: 'component reference' + JSON.stringify(componentsReference) },
198
-
199
- // ]
200
125
if ( ! conversation )
201
126
forms . set ( form , conversation = [ ] )
202
- // }
203
127
204
128
// 3 types avialable system, user, assistant
205
129
for ( let element of elements ) {
@@ -253,9 +177,11 @@ async function openaiAction(form) {
253
177
// conversation.push({ role, content })
254
178
// } else if (role === 'message' && content)
255
179
// conversation.push({ role: 'user', content })
180
+
256
181
}
182
+
257
183
if ( conversation . length )
258
- send ( conversation ) ;
184
+ send ( conversation , action ) ;
259
185
}
260
186
261
187
export default { send }
@@ -264,7 +190,6 @@ Actions.init({
264
190
name : "openAi" ,
265
191
endEvent : "openAi" ,
266
192
callback : ( action ) => {
267
- if ( action . form )
268
- openaiAction ( action . form ) ;
193
+ openaiAction ( action ) ;
269
194
}
270
195
} )
0 commit comments