From 027a40d3a02e8e53f2ea3577848154fea997ad5d Mon Sep 17 00:00:00 2001
From: Irene-Maxine <114802521+Irene-Maxine@users.noreply.github.com>
Date: Tue, 14 Oct 2025 14:20:52 +0800
Subject: [PATCH] =?UTF-8?q?mini=E5=A2=9E=E5=8A=A0=E4=BA=91=E7=AB=AF?=
=?UTF-8?q?=E6=99=BA=E8=83=BD-=E8=AF=AD=E9=9F=B3=E4=BA=A4=E4=BA=92?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../micropython/blocks/ai_cloud.js | 108 ++++++++++++++++
boards/default_src/micropython/export.js | 4 +
.../micropython/generators/ai_cloud.js | 48 +++++++
.../css/color_esp32c3_mixgocc.css | 10 ++
.../default_src/micropython_esp32c2/index.js | 4 +
.../micropython_esp32c2/template.xml | 118 ++++++++++++++++++
common/msg/blockly/en.js | 10 +-
common/msg/blockly/zh-hans.js | 10 +-
common/msg/blockly/zh-hant.js | 10 +-
9 files changed, 319 insertions(+), 3 deletions(-)
create mode 100644 boards/default_src/micropython/blocks/ai_cloud.js
create mode 100644 boards/default_src/micropython/generators/ai_cloud.js
diff --git a/boards/default_src/micropython/blocks/ai_cloud.js b/boards/default_src/micropython/blocks/ai_cloud.js
new file mode 100644
index 00000000..78435c0d
--- /dev/null
+++ b/boards/default_src/micropython/blocks/ai_cloud.js
@@ -0,0 +1,108 @@
+import * as Blockly from 'blockly/core';
+import { Variables } from '../../python/export';
+const AI_CLOUD_VOICE_HUE = '#88ada6';
+
+export const init_xunfei_vi = {
+ init: function () {
+ this.setColour(AI_CLOUD_VOICE_HUE);
+ 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 + Blockly.Msg.MIXLY_AipSpeech_asr );
+ this.appendValueInput('APPID')
+ .setCheck(String)
+ .appendField('APPID');
+ this.appendValueInput('APISecret')
+ .setCheck(String)
+ .appendField('APISecret');
+ this.appendValueInput('APIKey')
+ .setCheck(String)
+ .appendField('APIKey');
+ this.setInputsInline(false);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ }
+};
+
+
+
+export const init_xunfei_Spark_Ultra = {
+ init: function () {
+ this.setColour(AI_CLOUD_VOICE_HUE);
+ 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 );
+ this.appendValueInput('APPID')
+ .setCheck(String)
+ .appendField('APPID');
+ this.appendValueInput('APISecret')
+ .setCheck(String)
+ .appendField('APISecret');
+ this.appendValueInput('APIKey')
+ .setCheck(String)
+ .appendField('APIKey');
+ this.setInputsInline(false);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ }
+};
+
+export const init_xunfei_vi_run = {
+ init: function () {
+ this.setColour(AI_CLOUD_VOICE_HUE);
+ this.appendValueInput('VAR')
+ this.appendDummyInput()
+ .appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_AipSpeech_asr);
+ this.appendValueInput('time')
+ .setCheck(Number);
+ this.appendDummyInput()
+ .appendField(Blockly.Msg.MIXPY_AI_AUDIO_TIME);
+ this.setInputsInline(true);
+ this.setOutput(true);
+ this.setTooltip(Blockly.Msg.init_xunfei_vi_op_tooltip);
+ }
+};
+
+export const init_xunfei_Spark_Ultra_run = {
+ init: function () {
+ this.setColour(AI_CLOUD_VOICE_HUE);
+ this.appendValueInput('VAR')
+ this.appendDummyInput()
+ .appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL);
+ this.appendValueInput('qus')
+ .setCheck(String)
+ .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND);
+ this.setInputsInline(true);
+ this.setOutput(true);
+ this.setTooltip(Blockly.Msg.init_xunfei_vi_run_tooltip);
+ }
+};
+
+export const init_xunfei_Spark_Ultra_clr_his = {
+ init: function () {
+ this.setColour(AI_CLOUD_VOICE_HUE);
+ this.appendValueInput('VAR')
+ this.appendDummyInput()
+ .appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL + Blockly.Msg.MIXLY_EMPTY_HISTORY);
+ this.setInputsInline(true);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ }
+};
+
+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.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setInputsInline(true);
+ this.setTooltip(Blockly.Msg.llm_set_callback_tooltip);
+ }
+};
\ No newline at end of file
diff --git a/boards/default_src/micropython/export.js b/boards/default_src/micropython/export.js
index c95f5751..b0afa2d5 100644
--- a/boards/default_src/micropython/export.js
+++ b/boards/default_src/micropython/export.js
@@ -4,6 +4,7 @@ import * as MicroPythonActuatorBlocks from './blocks/actuator';
import * as MicroPythonAISensorBlocks from './blocks/ai_sensor';
import * as MicroPythonAIBlocks from './blocks/ai';
import * as MicroPythonAILocalBlocks from './blocks/ai_local';
+import * as MicroPythonAICloudBlocks from './blocks/ai_cloud';
import * as MicroPythonBlynkBlocks from './blocks/blynk';
import * as MicroPythonCCG1Blocks from './blocks/cc_g1';
import * as MicroPythonCEGOBlocks from './blocks/ce_go';
@@ -32,6 +33,7 @@ import * as MicroPythonActuatorGenerators from './generators/actuator';
import * as MicroPythonAISensorGenerators from './generators/ai_sensor';
import * as MicroPythonAILocalGenerators from './generators/ai_local';
import * as MicroPythonAIGenerators from './generators/ai';
+import * as MicroPythonAICloudGenerators from './generators/ai_cloud';
import * as MicroPythonBlynkGenerators from './generators/blynk';
import * as MicroPythonCCG1Generators from './generators/cc_g1';
import * as MicroPythonCEGOGenerators from './generators/ce_go';
@@ -67,6 +69,7 @@ export {
MicroPythonAISensorBlocks,
MicroPythonAIBlocks,
MicroPythonAILocalBlocks,
+ MicroPythonAICloudBlocks,
MicroPythonBlynkBlocks,
MicroPythonCCG1Blocks,
MicroPythonCEGOBlocks,
@@ -94,6 +97,7 @@ export {
MicroPythonAISensorGenerators,
MicroPythonAIGenerators,
MicroPythonAILocalGenerators,
+ MicroPythonAICloudGenerators,
MicroPythonBlynkGenerators,
MicroPythonCCG1Generators,
MicroPythonCEGOGenerators,
diff --git a/boards/default_src/micropython/generators/ai_cloud.js b/boards/default_src/micropython/generators/ai_cloud.js
new file mode 100644
index 00000000..b06a9436
--- /dev/null
+++ b/boards/default_src/micropython/generators/ai_cloud.js
@@ -0,0 +1,48 @@
+import { Boards } from 'mixly';
+
+export const init_xunfei_vi = function (_, generator) {
+ generator.definitions_['import_mini_xunfei'] = "import mini_xunfei";
+ var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
+ 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.ASR_WebSocket(' + id + ',' + key + ',' + s +')\n';
+ return code;
+}
+
+export const init_xunfei_Spark_Ultra = function (_, generator) {
+ generator.definitions_['import_mini_xunfei'] = "import mini_xunfei";
+ var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
+ 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';
+ return code;
+}
+
+export const init_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 +')';
+ var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
+ var q = generator.valueToCode(this, 'qus', generator.ORDER_ATOMIC);
+ var code = v + '.run(' + q +')';
+ return [code,generator.ORDER_ATOMIC];
+}
+
+export const init_xunfei_Spark_Ultra_clr_his = function (_, generator) {
+ var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
+ var code = v + '.empty_history()\n';
+ return code;
+}
+
+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 callback = generator.variableDB_.getName(
+ generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None",
+ Blockly.Procedures.NAME_TYPE
+ );
+ var code = v1 +".function_call(" + callback + ", " + v + ")\n";
+ return code;
+}
\ No newline at end of file
diff --git a/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css b/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css
index e471b651..66a1ed30 100644
--- a/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css
+++ b/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css
@@ -485,4 +485,14 @@ div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTr
#catBLEKM.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
background: url('../../../../common/media/mark/comuni2.png') no-repeat;
background-size: 100% auto;
+}
+
+#catVI.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
+ background: url('../../../../common/media/mark/AIvoice.png') no-repeat;
+ background-size: 100% auto;
+}
+
+#catVI.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
+ background: url('../../../../common/media/mark/AIvoice2.png') no-repeat;
+ background-size: 100% auto;
}
\ No newline at end of file
diff --git a/boards/default_src/micropython_esp32c2/index.js b/boards/default_src/micropython_esp32c2/index.js
index 799f3fbc..5e7438b2 100644
--- a/boards/default_src/micropython_esp32c2/index.js
+++ b/boards/default_src/micropython_esp32c2/index.js
@@ -39,6 +39,7 @@ import {
MicroPythonAISensorBlocks,
MicroPythonAIBlocks,
MicroPythonAILocalBlocks,
+ MicroPythonAICloudBlocks,
MicroPythonBlynkBlocks,
MicroPythonCCG1Blocks,
MicroPythonCEGOBlocks,
@@ -59,6 +60,7 @@ import {
MicroPythonAISensorGenerators,
MicroPythonAIGenerators,
MicroPythonAILocalGenerators,
+ MicroPythonAICloudGenerators,
MicroPythonBlynkGenerators,
MicroPythonCCG1Generators,
MicroPythonCEGOGenerators,
@@ -131,6 +133,7 @@ Object.assign(
MicroPythonWeatherBlocks,
MicroPythonAISensorBlocks,
MicroPythonAILocalBlocks,
+ MicroPythonAICloudBlocks,
MicroPythonSensorOnBoardBlocks,
MicroPythonSensorExternBlocks,
MicroPythonNetworkBlocks,
@@ -172,6 +175,7 @@ Object.assign(
MicroPythonWeatherGenerators,
MicroPythonAISensorGenerators,
MicroPythonAILocalGenerators,
+ MicroPythonAICloudGenerators,
MicroPythonSensorOnBoardGenerators,
MicroPythonSensorExternGenerators,
MicroPythonNetworkGenerators,
diff --git a/boards/default_src/micropython_esp32c2/template.xml b/boards/default_src/micropython_esp32c2/template.xml
index ba6169ac..1cf85669 100644
--- a/boards/default_src/micropython_esp32c2/template.xml
+++ b/boards/default_src/micropython_esp32c2/template.xml
@@ -2811,6 +2811,124 @@
+
+
+
+
+
+
+ asr
+
+
+
+
+ ba3917dd
+
+
+
+
+ Nzg4MWUyNGE1ZTcxOGZkNzM4NWQ4Yzdi
+
+
+
+
+ b47549319a8324f5eab3dd5c37dfa1dd
+
+
+
+
+
+
+ llm
+
+
+
+
+ ba3917dd
+
+
+
+
+ Nzg4MWUyNGE1ZTcxOGZkNzM4NWQ4Yzdi
+
+
+
+
+ b47549319a8324f5eab3dd5c37dfa1dd
+
+
+
+
+
+
+ asr
+
+
+
+
+ 3
+
+
+
+
+
+
+ llm
+
+
+
+
+ question
+
+
+
+
+
+
+ llm
+
+
+
+
+
+
+ llm
+
+
+
+
+ cb_func
+
+
+
+
+ "参数名","类型","描述"
+
+
+
+
+
+
+
+ cb_func
+
+
+
+
+
+ cb------
+
+
+
+
+ xx
+
+
+
+
+
+
+
diff --git a/common/msg/blockly/en.js b/common/msg/blockly/en.js
index c0f10e2f..3108cfb8 100644
--- a/common/msg/blockly/en.js
+++ b/common/msg/blockly/en.js
@@ -176,7 +176,9 @@ En.MSG = {
enablePythonToBlockly: "Blocks↔Code",
catSearch: "Search",
wiki: "Wiki",
- catTinyWebDB: "TinyWebDB"
+ catTinyWebDB: "TinyWebDB",
+ catCloudAI:"Cloud Intelligence",
+ catVI:"Voice Isnteraction"
};
/* 多重选择 */
@@ -4041,4 +4043,10 @@ En.MIXLY_TENSORFLOW_LOAD_MODEL = 'Use imported model';
En.MIXLY_TENSORFLOW_MODEL_NAME = 'Model name';
En.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR = 'Preprocess image to tensor';
En.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE = 'Read image';
+En.MIXLY_XUFEI = 'xunfei';
+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)'
})();
diff --git a/common/msg/blockly/zh-hans.js b/common/msg/blockly/zh-hans.js
index 5444af27..aee55ae5 100644
--- a/common/msg/blockly/zh-hans.js
+++ b/common/msg/blockly/zh-hans.js
@@ -187,7 +187,9 @@ ZhHans.MSG = {
enablePythonToBlockly: "图文互换",
catSearch: "查找",
wiki: "Wiki",
- catTinyWebDB: "TinyWebDB"
+ catTinyWebDB: "TinyWebDB",
+ catCloudAI:"云端智能",
+ catVI:"语音交互"
};
/* 多重选择 */
@@ -4199,4 +4201,10 @@ ZhHans.MIXLY_TENSORFLOW_LOAD_MODEL = '使用导入模型';
ZhHans.MIXLY_TENSORFLOW_MODEL_NAME = '模型名';
ZhHans.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR = '预处理图像为张量';
ZhHans.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE = '读入图像';
+ZhHans.MIXLY_XUFEI = '讯飞';
+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-布尔类型)'
})();
\ No newline at end of file
diff --git a/common/msg/blockly/zh-hant.js b/common/msg/blockly/zh-hant.js
index de64d220..f3e868bd 100644
--- a/common/msg/blockly/zh-hant.js
+++ b/common/msg/blockly/zh-hant.js
@@ -187,7 +187,9 @@ ZhHant.MSG = {
enablePythonToBlockly: "圖文互換",
catSearch: "查找",
wiki: "Wiki",
- catTinyWebDB: "TinyWebDB"
+ catTinyWebDB: "TinyWebDB",
+ catCloudAI:"雲端智能",
+ catVI:"語音交互"
};
/* 多重選擇 */
@@ -4194,4 +4196,10 @@ ZhHant.MIXLY_TENSORFLOW_LOAD_MODEL = '使用導入模型';
ZhHant.MIXLY_TENSORFLOW_MODEL_NAME = '模型名';
ZhHant.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR = '預處理圖像為張量';
ZhHant.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE = '讀入圖像';
+ZhHant.MIXLY_XUFEI = '訊飛';
+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-布爾類型)'
})();