仓颉语言初体验之30行代码实现一个qwen-CLI

380 阅读3分钟

仓颉不仅仅可以编写鸿蒙应用,也可以编写 CLI 或者后端程序,是一门全栈语言。因此结合自己大模型相关业务,准备些一个 hello world 级别的程序体验一下。

先看效果

录屏2024-09-21 16.07.35.gif

开发过程

申请开发者权限

  1. gitcode.com/Cangjie
  2. 提交申请 wj.qq.com/s2/14870499…

安装开发环境

安装仓颉插件

gitcode.com/Cangjie/Can…

首先,请在仓颉官方渠道(GitCode)根据平台架构下载相应安装包,交付内容为压缩包:Cangjie-vscode-version.tar.gz。

下载成功后,将其解压得到文件夹:Cangjie-vscode-version。

按照下图所示操作,打开文件资源管理器对话框,找到要安装的插件.vsix,点击确定即可安装。

已经安装的插件可以在 INSTALLED 目录下查看,确认后重启

安装 cangjie SDK

gitcode.com/Cangjie/Can…

mac_x86_64 平台的 SDK 下载内容为:Cangjie-version-darwin_x64.tar.gz。 mac_aarch64 平台的 SDK 下载内容为:Cangjie-version-darwin_aarch64.tar.gz。

将其下载后内容放置在本地环境中。mac 版本的目录结构如下:

直接右键点击插件,选择 Extension Settings,进入配置页面:

在搜索栏输入 cangjie, 然后选择侧边栏的 Cangjie Language Support 选项。

SDK 路径配置
  1. 找到 Cangjie Sdk: Option 选项,选择后端类型为 CJNative(默认是此选项)
  2. 找到 Cangjie Sdk Path: CJNative Backend 选项,输入 CJNative 后端 SDK 文件所在绝对路径
  3. 重启 VScode 生效

创建工程

在 VSCode 中快捷键为 "Command + Shift + P"打开命令面板,然后按照以下步骤创建仓颉工程:

实例相关代码

package hello

import std.os.process.*
import std.io.*
import encoding.json.*
import std.console.*

main() {
    let sk = "???"; // 通过阿里云百炼获取 sk
    let system = "每次回答不要太啰嗦";
  
    Console.stdOut.write("\n** welcome qwen cangjie demo **\n")
  
    while (true) {
        Console.stdOut.write("\n[Q]: ")
        // 获取控制台输入
        var query = Console.stdIn.readln().getOrThrow()
        // 调用 llm
        let result = Process.start("curl", '-X', 'POST',
            'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions', '-H', 'Authorization: Bearer ${sk}',
            '-H', 'Content-Type: application/json', '-d',
            '{"enable_search": true, "model":"qwen-turbo","messages":[{"role":"system","content":"${system}"},{"role":"user","content":"${query}"}]}',
            stdOut: ProcessRedirect.Pipe)

        Console.stdOut.write("\n")
        // 获取 llm 结果
        let strReader = StringReader(result.stdOut)
        let s = strReader.readToEnd()

        let jv: JsonValue = JsonValue.fromStr(s)
        let str = jv.asObject().get('choices').getOrThrow().toString();
        // 输出到控制台
        Console.stdOut.writeln("\n[A]: " + str)
    }

    return
}