diff --git a/bricks/agent.js b/bricks/agent.js index 04072c2..60f4a6e 100644 --- a/bricks/agent.js +++ b/bricks/agent.js @@ -310,7 +310,7 @@ bricks.AgentIO = class extends bricks.VBox { width: '100%', css: 'filler' }); - this.inputw = new bricks.TextFiles({}); + this.inputw = new bricks.AgentInput({model_dataurl:this.opts.model_dataurl,model_cwidth:this.opts.model_cwidth,placeholder:this.opts.placeholder}); this.inputw.bind('inputed', this.user_inputed.bind(this)); this.add_widget(this.msg_box); this.add_widget(this.inputw); diff --git a/bricks/agent_input.js b/bricks/agent_input.js new file mode 100644 index 0000000..8786a52 --- /dev/null +++ b/bricks/agent_input.js @@ -0,0 +1,123 @@ +// AgentInput — 集成模型选择的输入控件 +// options: { model_dataurl, model_cwidth, placeholder, url(提交图标), ...VBox 原有属性 } +// event: inputed → { prompt, add_files, model_id } + +bricks.AgentInput = class extends bricks.VBox { + constructor(opts) { + opts.height = 'auto'; + opts.width = '100%'; + super(opts); + + // file upload + this.inputfilew = new bricks.UiFile({name: 'add_file'}); + this.filesbar = new bricks.DynamicColumn({col_cwidth: 10}); + this.add_files = []; + this.file_names = []; + this.inputfilew.bind('changed', this.file_added.bind(this)); + + // text input + this.textw = new bricks.UiText({ + name: 'prompt', + placeholder: opts.placeholder || '' + }); + + // model selector — 直接用 UiCode,不用 Form + this.model_selector = new bricks.UiCode({ + name: 'model_id', + valueField: 'model_id', + textField: 'model_id_text', + dataurl: opts.model_dataurl || '', + params: opts.model_params || {}, + cwidth: opts.model_cwidth || 12, + cfontsize: 0.85 + }); + + // add file button + var addfilew = new bricks.Svg({ + cwidth: 1.5, cheight: 1.5, + url: bricks_resource('imgs/add.svg') + }); + addfilew.bind('click', this.add_file.bind(this)); + + // submit button + var inputw = new bricks.Svg({ + cwidth: 1.5, cheight: 1.5, + url: opts.url || bricks_resource('imgs/submit.svg') + }); + inputw.bind('click', this.input_finished.bind(this)); + + // button row: [+add] [model_selector] [filler] [submit] + var hbox = new bricks.HBox({cheight: 1.5, gap: '4px', alignItems: 'center'}); + hbox.add_widget(addfilew); + hbox.add_widget(this.model_selector); + hbox.add_widget(new bricks.VBox({css: 'filler'})); + hbox.add_widget(inputw); + + // assemble + this.add_widget(this.inputfilew); + this.add_widget(this.filesbar); + this.add_widget(this.textw); + this.add_widget(hbox); + + this.filesbar.hide(); + this.inputfilew.hide(); + } + + input_finished() { + var txt = this.textw.getValue(); + if (!txt.prompt || txt.prompt.length < 1) return; + var p = this.params || {}; + var mv = this.model_selector.getValue(); + // UiCode 的 getValue 可能返回对象也可能返回字符串,统一提取 + var mid = ''; + if (typeof mv === 'object' && mv !== null) { + mid = mv.model_id || mv.value || ''; + } else { + mid = mv || ''; + } + var d = Object.assign({}, p, { + add_files: this.add_files, + file_names: this.file_names, + prompt: txt.prompt, + model_id: mid + }); + this.dispatch('inputed', d); + this.textw.setValue(''); + this.add_files = []; + this.file_names = []; + this.filesbar.clear_widgets(); + this.filesbar.hide(); + } + + file_added(e) { + this.inputfilew.hide(); + var file = this.inputfilew.getValue().add_file; + this.inputfilew.reset(); + this.add_files.push(file); + this.file_names.push(file.name); + this.filesbar.clear_widgets(); + var w = new bricks.DeletableLabel({label: file.name}); + this.filesbar.add_widget(w); + this.filesbar.show(); + w.bind('deleted', this.deleted_file.bind(this, file)); + } + + deleted_file(file) { + this.add_files = this.add_files.filter(i => i !== file); + this.file_names = this.file_names.filter(n => n !== file.name); + if (this.add_files.length === 0) this.filesbar.hide(); + } + + add_file() { + this.inputfilew.show(); + } + + getValue() { + return { + prompt: (this.textw.getValue() || {}).prompt || '', + model_id: this.model_selector.getValue() || '' + }; + } +}; + +bricks.Factory.register('AgentInput', bricks.AgentInput); diff --git a/bricks/build.sh b/bricks/build.sh index 49b30e6..4e7a9cb 100755 --- a/bricks/build.sh +++ b/bricks/build.sh @@ -13,7 +13,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \ line.js pie.js bar.js gobang.js period.js iconbarpage.js \ keypress.js asr.js webspeech.js countdown.js progressbar.js \ qaframe.js svg.js videoplayer.js scatter.js radar.js kline.js \ - heatmap.js map.js qr.js textfiles.js agent.js api_doc.js flipcard.js carousel.js draggable.js " + heatmap.js map.js qr.js textfiles.js agent_input.js agent.js api_doc.js flipcard.js carousel.js draggable.js " echo ${SOURCES} cat ${SOURCES} > ../dist/bricks.js # uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js