darabos commited on
Commit
54e01be
·
1 Parent(s): a06b506

Dropdown for enum parameters.

Browse files
server/lynxscribe_ops.py CHANGED
@@ -4,7 +4,7 @@ from .ops import register_passive_op, Parameter as P
4
  register_passive_op('Scrape documents', inputs={}, params=[P('url', '')])
5
  register_passive_op('Extract graph')
6
  register_passive_op('Compute embeddings')
7
- register_passive_op('Vector DB', params=[P('backend', 'FAISS')])
8
  register_passive_op('Chat UI', outputs={})
9
  register_passive_op('Chat backend', inputs={})
10
  register_passive_op('WhatsApp', inputs={})
 
4
  register_passive_op('Scrape documents', inputs={}, params=[P('url', '')])
5
  register_passive_op('Extract graph')
6
  register_passive_op('Compute embeddings')
7
+ register_passive_op('Vector DB', params=[P.options('backend', ['FAISS', 'ANN', 'HNSW'])])
8
  register_passive_op('Chat UI', outputs={})
9
  register_passive_op('Chat backend', inputs={})
10
  register_passive_op('WhatsApp', inputs={})
server/networkx_ops.py CHANGED
@@ -37,8 +37,6 @@ for (name, func) in nx.__dict__.items():
37
  # No annotation, no default — we must guess the type.
38
  if len(k) == 1:
39
  params[k] = 1
40
- if name == 'ladder_graph':
41
- print(params)
42
  name = "NX › " + name.replace('_', ' ').title()
43
  op = ops.Op(wrapped(func), name, params=params, inputs=inputs, outputs={'output': 'yes'}, type='basic')
44
  ops.ALL_OPS[name] = op
 
37
  # No annotation, no default — we must guess the type.
38
  if len(k) == 1:
39
  params[k] = 1
 
 
40
  name = "NX › " + name.replace('_', ' ').title()
41
  op = ops.Op(wrapped(func), name, params=params, inputs=inputs, outputs={'output': 'yes'}, type='basic')
42
  ops.ALL_OPS[name] = op
server/ops.py CHANGED
@@ -1,5 +1,6 @@
1
  '''API for implementing LynxKite operations.'''
2
  import dataclasses
 
3
  import functools
4
  import inspect
5
  import networkx as nx
@@ -16,14 +17,22 @@ class Parameter:
16
  default: any
17
  type: PARAM_TYPE = None
18
 
 
 
 
 
19
  def __post_init__(self):
20
  if self.type is None:
21
  self.type = type(self.default)
22
  def to_json(self):
 
 
 
 
23
  return {
24
  'name': self.name,
25
  'default': self.default,
26
- 'type': str(self.type),
27
  }
28
 
29
  @dataclasses.dataclass
 
1
  '''API for implementing LynxKite operations.'''
2
  import dataclasses
3
+ import enum
4
  import functools
5
  import inspect
6
  import networkx as nx
 
17
  default: any
18
  type: PARAM_TYPE = None
19
 
20
+ @staticmethod
21
+ def options(name, options):
22
+ return Parameter(name, options[0], enum.Enum(f'OptionsFor{name}', options))
23
+
24
  def __post_init__(self):
25
  if self.type is None:
26
  self.type = type(self.default)
27
  def to_json(self):
28
+ if isinstance(self.type, type) and issubclass(self.type, enum.Enum):
29
+ t = {'enum': list(self.type.__members__.keys())}
30
+ else:
31
+ t = str(self.type)
32
  return {
33
  'name': self.name,
34
  'default': self.default,
35
+ 'type': t,
36
  }
37
 
38
  @dataclasses.dataclass
server/pytorch_model_ops.py CHANGED
@@ -32,7 +32,7 @@ def register_layer(name):
32
  return decorator
33
 
34
  @register_layer('LayerNorm')
35
- def normalization():
36
  return 'LayerNorm'
37
 
38
  @register_layer('Dropout')
 
32
  return decorator
33
 
34
  @register_layer('LayerNorm')
35
+ def layernorm():
36
  return 'LayerNorm'
37
 
38
  @register_layer('Dropout')
server/workspace.py CHANGED
@@ -42,7 +42,6 @@ class Workspace(BaseConfig):
42
  def execute(ws):
43
  # Nodes are responsible for interpreting/executing their child nodes.
44
  nodes = [n for n in ws.nodes if not n.parentNode]
45
- print(nodes)
46
  children = {}
47
  for n in ws.nodes:
48
  if n.parentNode:
 
42
  def execute(ws):
43
  # Nodes are responsible for interpreting/executing their child nodes.
44
  nodes = [n for n in ws.nodes if not n.parentNode]
 
45
  children = {}
46
  for n in ws.nodes:
47
  if n.parentNode:
web/src/LynxKiteFlow.svelte CHANGED
@@ -1,4 +1,5 @@
1
  <script lang="ts">
 
2
  import { writable, derived } from 'svelte/store';
3
  import {
4
  SvelteFlow,
@@ -139,9 +140,13 @@
139
  || e.targetHandle !== connection.targetHandle);
140
  });
141
  }
 
 
 
 
142
  function nodeClick(e) {
143
  const node = e.detail.node;
144
- const meta = $boxes.find(m => m.data.title === node.data.title);
145
  if (!meta) return;
146
  const sub_nodes = meta.sub_nodes;
147
  if (!sub_nodes) return;
 
1
  <script lang="ts">
2
+ import { setContext } from 'svelte';
3
  import { writable, derived } from 'svelte/store';
4
  import {
5
  SvelteFlow,
 
140
  || e.targetHandle !== connection.targetHandle);
141
  });
142
  }
143
+ function getMeta(title) {
144
+ return $boxes.find((m) => m.data.title === title);
145
+ }
146
+ setContext('LynxKiteFlow', { getMeta });
147
  function nodeClick(e) {
148
  const node = e.detail.node;
149
+ const meta = getMeta(node.data.title);
150
  if (!meta) return;
151
  const sub_nodes = meta.sub_nodes;
152
  if (!sub_nodes) return;
web/src/NodeWithParams.svelte CHANGED
@@ -1,10 +1,13 @@
1
  <script lang="ts">
 
2
  import { type NodeProps, useSvelteFlow } from '@xyflow/svelte';
3
  import LynxKiteNode from './LynxKiteNode.svelte';
4
  type $$Props = NodeProps;
5
  export let id: $$Props['id'];
6
  export let data: $$Props['data'];
7
  const { updateNodeData } = useSvelteFlow();
 
 
8
  </script>
9
 
10
  <LynxKiteNode {...$$props}>
@@ -12,10 +15,21 @@
12
  <div class="param">
13
  <label>
14
  {name}<br>
15
- <input
 
 
 
 
 
 
 
 
 
 
16
  value={value}
17
  on:input={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
18
- />
 
19
  </label>
20
  </div>
21
  {/each}
@@ -28,7 +42,8 @@
28
  font-size: 12px;
29
  display: block;
30
  }
31
- .param input {
 
32
  width: calc(100% - 8px);
33
  }
34
  </style>
 
1
  <script lang="ts">
2
+ import { getContext } from 'svelte';
3
  import { type NodeProps, useSvelteFlow } from '@xyflow/svelte';
4
  import LynxKiteNode from './LynxKiteNode.svelte';
5
  type $$Props = NodeProps;
6
  export let id: $$Props['id'];
7
  export let data: $$Props['data'];
8
  const { updateNodeData } = useSvelteFlow();
9
+ $: meta = getContext('LynxKiteFlow').getMeta(data.title);
10
+ $: metaParams = Object.fromEntries(meta.data.params.map((p) => [p.name, p]));
11
  </script>
12
 
13
  <LynxKiteNode {...$$props}>
 
15
  <div class="param">
16
  <label>
17
  {name}<br>
18
+ {#if metaParams[name].type.enum}
19
+ <select
20
+ value={value}
21
+ on:change={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
22
+ >
23
+ {#each metaParams[name].type.enum as option}
24
+ <option value={option}>{option}</option>
25
+ {/each}
26
+ </select>
27
+ {:else}
28
+ <input
29
  value={value}
30
  on:input={(evt) => updateNodeData(id, { params: { ...data.params, [name]: evt.currentTarget.value } })}
31
+ />
32
+ {/if}
33
  </label>
34
  </div>
35
  {/each}
 
42
  font-size: 12px;
43
  display: block;
44
  }
45
+ .param input,
46
+ .param select {
47
  width: calc(100% - 8px);
48
  }
49
  </style>