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 = '支持';
})();