diff --git a/boards/default_src/micropython/blocks/actuator_onboard.js b/boards/default_src/micropython/blocks/actuator_onboard.js index 8204f761..d0d9cf24 100644 --- a/boards/default_src/micropython/blocks/actuator_onboard.js +++ b/boards/default_src/micropython/blocks/actuator_onboard.js @@ -538,6 +538,19 @@ export const esp32_onboard_music_play_list = { } } +export const backstage_onboard_music_play_list = { + init: function () { + this.setColour(ACTUATOR_ONBOARD_HUE); + this.appendValueInput('LIST') + .appendField(Blockly.Msg.MIXLY_BACKSTAGE + Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS); + + } +} + export const rm_motor = { init: function () { this.setColour(ACTUATOR_ONBOARD_HUE); diff --git a/boards/default_src/micropython/blocks/ai_cloud.js b/boards/default_src/micropython/blocks/ai_cloud.js index 78435c0d..fc413ad6 100644 --- a/boards/default_src/micropython/blocks/ai_cloud.js +++ b/boards/default_src/micropython/blocks/ai_cloud.js @@ -18,7 +18,7 @@ export const init_xunfei_vi = { this.appendValueInput('APIKey') .setCheck(String) .appendField('APIKey'); - this.setInputsInline(false); + this.setInputsInline(true); this.setPreviousStatement(true); this.setNextStatement(true); } @@ -32,7 +32,7 @@ export const init_xunfei_Spark_Ultra = { this.appendValueInput('VAR') .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); this.appendDummyInput() - .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI + 'Spark Ultra' +Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL ); + .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI +Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL ); this.appendValueInput('APPID') .setCheck(String) .appendField('APPID'); @@ -42,13 +42,29 @@ export const init_xunfei_Spark_Ultra = { this.appendValueInput('APIKey') .setCheck(String) .appendField('APIKey'); - this.setInputsInline(false); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SELECT_MODEL) + .appendField(new Blockly.FieldDropdown([ + ["Spark-X1-32K","Spark X1-32K"], + ["Spark-Lite","Spark Lite"], + ["Spark-Pro","Spark Pro"], + ["Spark-Pro-128K","Spark Pro-128K"], + ["Spark-Max, " + Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND + "、" + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Max"], + ["Spark-Max-32K, "+ Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND + "、" + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Max-32K"], + ["Spark-Ultra-32K, "+ Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND + "、" + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Ultra-32K"], + [Blockly.Msg.MIXLY_KJWX, "Spark kjwx"], + [Blockly.Msg.MIXLY_CUSTOMIZE_MODEL + "," + Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Customize"] + ]),"model"); + this.appendValueInput('DBG') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND); + this.setInputsInline(true); this.setPreviousStatement(true); this.setNextStatement(true); } }; -export const init_xunfei_vi_run = { +export const xunfei_vi_run = { init: function () { this.setColour(AI_CLOUD_VOICE_HUE); this.appendValueInput('VAR') @@ -64,7 +80,7 @@ export const init_xunfei_vi_run = { } }; -export const init_xunfei_Spark_Ultra_run = { +export const xunfei_Spark_Ultra_run = { init: function () { this.setColour(AI_CLOUD_VOICE_HUE); this.appendValueInput('VAR') @@ -95,14 +111,122 @@ export const llm_set_callback = { init: function () { this.setColour(AI_CLOUD_VOICE_HUE); this.appendValueInput('VAR1') - .appendField(Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL) this.appendValueInput('callback') .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) - this.appendValueInput('VAR') - .appendField(Blockly.Msg.MIXLY_PARAMS); + this.appendValueInput('VAR2') + .appendField(Blockly.Msg.MIXLY_FUNCTION_NAME); + this.appendValueInput('VAR3') + .appendField(Blockly.Msg.MIXLY_FUNCTION_DESCRIPTION) + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_PARAMS + Blockly.Msg.OLED_STRING); + + this.itemCount_ = 2; + this.updateShape_(); + + this.setMutator(new Blockly.icons.MutatorIcon(['llm_set_callback_item'], this)); this.setPreviousStatement(true); this.setNextStatement(true); this.setInputsInline(true); this.setTooltip(Blockly.Msg.llm_set_callback_tooltip); + }, + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('llm_set_callback_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('llm_set_callback_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i) + .connection.connect(connections[i]); + } + } + }, + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + // .appendField(Blockly.Msg.MIXLY_PARAMS); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + // input.appendField(Blockly.MIXLY_PARAMS); + } + } + } + } +}; + +export const llm_set_callback_container = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETTING + Blockly.Msg.MIXLY_PARAMS); + this.appendStatementInput('STACK'); + this.contextMenu = false; + } +}; + +export const llm_set_callback_item = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.contextMenu = false; } }; \ No newline at end of file diff --git a/boards/default_src/micropython/generators/actuator_onboard.js b/boards/default_src/micropython/generators/actuator_onboard.js index 7346adf3..7cbe99b1 100644 --- a/boards/default_src/micropython/generators/actuator_onboard.js +++ b/boards/default_src/micropython/generators/actuator_onboard.js @@ -70,6 +70,14 @@ export const esp32_onboard_music_play_list = function (_, generator) { return code; } +export const backstage_onboard_music_play_list = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2] + var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT); + generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music'; + var code = "onboard_music.play_thread(" + lst + ")\n"; + return code; +} + export const esp32_music_reset = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2] generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music'; diff --git a/boards/default_src/micropython/generators/ai_cloud.js b/boards/default_src/micropython/generators/ai_cloud.js index b06a9436..7a7a5096 100644 --- a/boards/default_src/micropython/generators/ai_cloud.js +++ b/boards/default_src/micropython/generators/ai_cloud.js @@ -16,14 +16,19 @@ export const init_xunfei_Spark_Ultra = function (_, generator) { var id = generator.valueToCode(this, 'APPID', generator.ORDER_ATOMIC); var s = generator.valueToCode(this, 'APISecret', generator.ORDER_ATOMIC); var key = generator.valueToCode(this, 'APIKey', generator.ORDER_ATOMIC); - var code = v + ' = mini_xunfei.LLM_WebSocket(' + id + ',' + key + ',' + s +')\n'; + var m = this.getFieldValue('model'); + var code = v + ' = mini_xunfei.LLM_WebSocket(' + id + ',' + key + ',' + s + ',"' + m + '")\n'; return code; } -export const init_xunfei_vi_run = function (_, generator) { +export const xunfei_vi_run = function (_, generator) { var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC); var code = v + '.run(' + t +')'; + return [code,generator.ORDER_ATOMIC]; +} + +export const xunfei_Spark_Ultra_run = function (_, generator) { var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); var q = generator.valueToCode(this, 'qus', generator.ORDER_ATOMIC); var code = v + '.run(' + q +')'; @@ -38,11 +43,24 @@ export const init_xunfei_Spark_Ultra_clr_his = function (_, generator) { export const llm_set_callback = function (_, generator) { var v1 = generator.valueToCode(this, "VAR1", generator.ORDER_NONE) || "None"; - var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var v2 = generator.valueToCode(this, "VAR2", generator.ORDER_NONE) || "None"; + var v3 = generator.valueToCode(this, "VAR3", generator.ORDER_NONE) || "None"; + var a0 = generator.valueToCode(this, "ADD0", generator.ORDER_NONE) || "None"; var callback = generator.variableDB_.getName( generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None", Blockly.Procedures.NAME_TYPE ); - var code = v1 +".function_call(" + callback + ", " + v + ")\n"; + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value; + } + if (this.itemCount_ > 1){ + var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 + ', (' + code.join(', ') +'))\n'; + }else{ + var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 + ', ' + code.join(', ') +')\n'; + } + return code; -} \ No newline at end of file +} + diff --git a/boards/default_src/micropython_esp32c2/template.xml b/boards/default_src/micropython_esp32c2/template.xml index 1cf85669..a5a3a8bd 100644 --- a/boards/default_src/micropython_esp32c2/template.xml +++ b/boards/default_src/micropython_esp32c2/template.xml @@ -1629,6 +1629,11 @@ + + + + + @@ -2822,17 +2827,17 @@ - ba3917dd + - Nzg4MWUyNGE1ZTcxOGZkNzM4NWQ4Yzdi + - b47549319a8324f5eab3dd5c37dfa1dd + @@ -2844,21 +2849,26 @@ - ba3917dd + - Nzg4MWUyNGE1ZTcxOGZkNzM4NWQ4Yzdi + - b47549319a8324f5eab3dd5c37dfa1dd + - + + + + + + - + asr @@ -2870,7 +2880,7 @@ - + llm @@ -2900,12 +2910,33 @@ cb_func - - - "参数名","类型","描述" + + + 灯光控制 + + + + + 用来控制LED灯光的开关 + + + + + + + + power + + + + + 开为true,关为false + + + diff --git a/boards/default_src/python/blocks/tuple.js b/boards/default_src/python/blocks/tuple.js index 35dd7ce3..8620f19c 100644 --- a/boards/default_src/python/blocks/tuple.js +++ b/boards/default_src/python/blocks/tuple.js @@ -741,4 +741,32 @@ export const tuple_input = { .appendField(')'); this.setOutput(true); } +}; + + +export const tuple_create_llm_params= { + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput("params") + .appendField('(') + .appendField(Blockly.Msg.MIXLY_NAME_OF_PARAMS) + this.appendDummyInput() + .appendField(',') + .appendField(Blockly.Msg.MIXLY_TYPE) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TYPE_BOOLEAN,"boolean"], + [Blockly.Msg.MIXLY_TYPE_STRING,"string"], + [Blockly.Msg.MIXLY_TYPE_NUMBER,"number"], + [Blockly.Msg.MIXLY_TYPE_INTEGER,"integer"], + [Blockly.Msg.MIXLY_TYPE_NULL,"null"] + ]),"type") + this.appendValueInput("des") + .appendField(',') + .appendField(Blockly.Msg.MIXLY_DESCRIPTION) + this.appendDummyInput() + .appendField(')'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT); + } }; \ No newline at end of file diff --git a/boards/default_src/python/generators/tuple.js b/boards/default_src/python/generators/tuple.js index e745407d..8e0649a7 100644 --- a/boards/default_src/python/generators/tuple.js +++ b/boards/default_src/python/generators/tuple.js @@ -295,4 +295,12 @@ export const tuple_input = function (_, generator) { var text = this.getFieldValue('CONTENT'); var code = '(' + text + ')'; return [code, generator.ORDER_ATOMIC]; +} + +export const tuple_create_llm_params = function (_, generator) { + var params = generator.valueToCode(this, 'params', generator.ORDER_ATOMIC) || '0' + var des = generator.valueToCode(this, 'des', generator.ORDER_ATOMIC) || '0' + var type = this.getFieldValue('type'); + var code = '(' + params + ',"' + type + '",' + des +')'; + return [code, generator.ORDER_ATOMIC]; } \ No newline at end of file diff --git a/common/msg/blockly/en.js b/common/msg/blockly/en.js index 3108cfb8..9ff01cd1 100644 --- a/common/msg/blockly/en.js +++ b/common/msg/blockly/en.js @@ -4048,5 +4048,20 @@ En.MIXLY_LARGE_LANGUAGE_MODEL = 'large language model'; En.init_xunfei_vi_op_tooltip = 'return text result of speech recognition'; En.MIXLY_RUN = 'run'; En.init_xunfei_vi_run_tooltip = 'return large language model text output'; -En.llm_set_callback_tooltip = 'tpyes (string,number(includde float),integer,boolean)' +En.llm_set_callback_tooltip = 'tpyes (string,number(includde float),integer,boolean)'; +En.MIXLY_SELECT_MODEL = 'select model'; +En.MIXLY_BACKSTAGE = 'backstage'; +En.MIXLY_FUNCTION_NAME = 'name of function'; +En.MIXLY_FUNCTION_DESCRIPTION = 'descriptioni of function'; +En.MIXLY_NAME_OF_PARAMS = 'name of params'; +En.MIXLY_TYPE_STRING = 'string'; +En.MIXLY_TYPE_NUMBER = 'number'; +En.MIXLY_TYPE_INTEGER = 'integer'; +En.MIXLY_TYPE_BOOLEAN = 'boolean'; +En.MIXLY_TYPE_NULL = 'null'; +En.MIXLY_DESCRIPTION = 'description'; +En.MIXLY_KJWX = 'scientific research model'; +En.MIXLY_DIALOGUE_BACKGROUND = 'dialogue backgroud'; +En.MIXLY_CUSTOMIZE_MODEL = 'customize model'; +En.MIXLY_SUPPORT = 'support'; })(); diff --git a/common/msg/blockly/zh-hans.js b/common/msg/blockly/zh-hans.js index aee55ae5..6adb5f69 100644 --- a/common/msg/blockly/zh-hans.js +++ b/common/msg/blockly/zh-hans.js @@ -4085,7 +4085,7 @@ ZhHans.MIXLY_LLM_CONTENT_CALLBACK = '结果输出回调'; // ZhHans.MIXLY_OLLAMA_SET_TIMEOUT = '设置超时时间'; // ZhHans.MIXLY_OLLAMA_SET_MAX_RETRIES = '设置最大重试次数'; // ZhHans.MIXLY_OLLAMA_SET_CUSTOM_URL = '设置自定义链接'; -// ZhHans.MIXLY_SELECT_MODEL = '选择模型'; +ZhHans.MIXLY_SELECT_MODEL = '选择模型'; // ZhHans.MIXLY_CLEAR_USER_HISTORY = '清除用户的历史记录'; ZhHans.MIXLY_EMPTY_HISTORY = '清空历史记录'; ZhHans.MIXLY_SET_RADIAN = '将弧度'; @@ -4206,5 +4206,19 @@ ZhHans.MIXLY_LARGE_LANGUAGE_MODEL = '大模型'; ZhHans.init_xunfei_vi_op_tooltip = '返回 语音识别文字结果'; ZhHans.MIXLY_RUN = '运行'; ZhHans.init_xunfei_vi_run_tooltip = '返回 大模型文字结果'; -ZhHans.llm_set_callback_tooltip = '类型有(string-字符串类型,number-数字类型(含小数),integer-整数类型,boolean-布尔类型)' +ZhHans.llm_set_callback_tooltip = '类型有(string-字符串类型,number-数字类型(含小数),integer-整数类型,boolean-布尔类型)'; +ZhHans.MIXLY_BACKSTAGE = '后台'; +ZhHans.MIXLY_FUNCTION_NAME = '功能名称'; +ZhHans.MIXLY_FUNCTION_DESCRIPTION = '功能描述'; +ZhHans.MIXLY_NAME_OF_PARAMS = '参数名'; +ZhHans.MIXLY_TYPE_STRING = '字符串'; +ZhHans.MIXLY_TYPE_NUMBER = '数字'; +ZhHans.MIXLY_TYPE_INTEGER = '整数'; +ZhHans.MIXLY_TYPE_BOOLEAN = '布尔'; +ZhHans.MIXLY_TYPE_NULL = '空'; +ZhHans.MIXLY_DESCRIPTION = '描述'; +ZhHans.MIXLY_KJWX = '科研大模型'; +ZhHans.MIXLY_DIALOGUE_BACKGROUND = '对话背景'; +ZhHans.MIXLY_CUSTOMIZE_MODEL = '可定制化大模型'; +ZhHans.MIXLY_SUPPORT = '支持'; })(); \ No newline at end of file diff --git a/common/msg/blockly/zh-hant.js b/common/msg/blockly/zh-hant.js index f3e868bd..52bea6dc 100644 --- a/common/msg/blockly/zh-hant.js +++ b/common/msg/blockly/zh-hant.js @@ -4201,5 +4201,20 @@ ZhHant.MIXLY_LARGE_LANGUAGE_MODEL = '大模型'; ZhHant.init_xunfei_vi_op_tooltip = '返回 語音識別文字結果'; ZhHant.MIXLY_RUN = '運行'; ZhHant.init_xunfei_vi_run_tooltip = '返回 大模型文字結果'; -ZhHant.llm_set_callback_tooltip = '類型有(string-字符串類型,number-數字類型(含小數),integer-整數類型,boolean-布爾類型)' +ZhHant.llm_set_callback_tooltip = '類型有(string-字符串類型,number-數字類型(含小數),integer-整數類型,boolean-布爾類型)'; +ZhHant.MIXLY_SELECT_MODEL = '選擇模型'; +ZhHant.MIXLY_BACKSTAGE = '後台'; +ZhHant.MIXLY_FUNCTION_NAME = '功能名稱'; +ZhHant.MIXLY_FUNCTION_DESCRIPTION = '功能描述'; +ZhHant.MIXLY_NAME_OF_PARAMS = '參數名'; +ZhHant.MIXLY_TYPE_STRING = '字符串'; +ZhHant.MIXLY_TYPE_NUMBER = '數字'; +ZhHant.MIXLY_TYPE_INTEGER = '整數'; +ZhHant.MIXLY_TYPE_BOOLEAN = '布爾'; +ZhHant.MIXLY_TYPE_NULL = '空'; +ZhHant.MIXLY_DESCRIPTION = '描述'; +ZhHant.MIXLY_KJWX = '科研大模型'; +ZhHant.MIXLY_DIALOGUE_BACKGROUND = '對話背景'; +ZhHant.MIXLY_CUSTOMIZE_MODEL = '可定製化大模型'; +ZhHant.MIXLY_SUPPORT = '支持'; })();