当前位置: 首页 > java >正文

Electron Forge【实战】阿里百炼大模型 —— AI 聊天

获取 apiKey

登录并开通阿里云百炼
https://bailian.console.aliyun.com/#/home

新人有半年免费的使用福利,在模型详情中,可以查看剩余的免费额度
https://bailian.console.aliyun.com/?tab=model#/model-market/detail/qwen-turbo

在这里插入图片描述

在下方链接中创建 apiKey
https://bailian.console.aliyun.com/?tab=model#/api-key

在这里插入图片描述

安装 OpenAI SDK

npm install openai

src/providers/OpenAIProvider.ts

import OpenAI from 'openai'interface ChatMessageProps {role: string;content: string;
}interface UniversalChunkProps {is_end: boolean;result: string;
}export class OpenAIProvider {private client: OpenAI;constructor(apiKey: string, baseURL: string) {this.client = new OpenAI({apiKey,baseURL})}async chat(messages: ChatMessageProps[], model: string) {const stream = await this.client.chat.completions.create({model,messages,stream: true})const self = thisreturn {async *[Symbol.asyncIterator]() {for await (const chunk of stream) {yield self.transformResponse(chunk)}}}}protected transformResponse(chunk: OpenAI.Chat.Completions.ChatCompletionChunk): UniversalChunkProps {const choice = chunk.choices[0]return {is_end: choice.finish_reason === 'stop',result: choice.delta.content || ''}}
}

src/providers/createProvider.ts

import { QianfanProvider } from "./QianfanProvider";
import { OpenAIProvider } from './OpenAIProvider'export function createProvider(providerName: string) {const providerConfigs = {aliyun: {apiKey: "换成第一步获取的apiKey",baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",}};// 为了解决类型错误,先进行类型断言,确保可以通过 providerName 访问 providerConfigsconst providerConfig = (providerConfigs as { [key: string]: any })[providerName];switch (providerName) {case "qianfan":if (!providerConfig.accessKey || !providerConfig.secretKey) {throw new Error("缺少千帆API配置:请在设置中配置 accessKey 和 secretKey");}return new QianfanProvider(providerConfig.accessKey,providerConfig.secretKey);case 'aliyun':if (!providerConfig.apiKey || !providerConfig.baseUrl) {throw new Error('缺少阿里云百炼API配置:请在设置中配置 apiKey 和 baseUrl')}return new OpenAIProvider(providerConfig.apiKey, providerConfig.baseUrl)default:throw new Error(`不支持的AI服务提供商: ${providerName}`);}
}

其他通用代码见
https://blog.csdn.net/weixin_41192489/article/details/147492144

效果预览

在这里插入图片描述
在这里插入图片描述

http://www.xdnf.cn/news/1985.html

相关文章:

  • BGP网络协议
  • 数据可视化平台产品介绍及功能特色
  • .NET 10 中的新增功能
  • 力扣347:前K个高频元素
  • 文章记单词 | 第43篇(六级)
  • Kafka和flume整合
  • cJSON中#define cJSON_IsReference 256 和 #define cJSON_StringIsConst 512这定义的大小是?
  • CSS常见布局
  • 逐行解析性能奥秘:借助 `line_profiler` 深入优化热点函数
  • MySQL 从入门到精通:第二篇 - 数据类型、约束与索引
  • 【华为HCIP | 华为数通工程师】821—多选解析—第十六页
  • 那些年踩过的坑之Arrays.asList
  • CC攻击的类型都有哪些?
  • eclipse怎么导入junit4
  • 解读《数据资产质量评估实施规则》:企业数据资产认证落地的关键指南
  • MCP(Model Context Protocol)
  • AlarmClock4.8.4(官方版)桌面时钟工具软件下载安装教程
  • Zephyr kernel Build System (CMake)介绍
  • MySQL引擎分类与选择、SQL更新底层实现、分库分表、读写分离、主从复制 - 面试实战
  • 数字浪潮下的算力担当:GPU 服务器的多元应用、核心价值
  • 技术探索之路:从自我认知到成长规划
  • 实现层归一化
  • 数据结构------C语言经典题目(7)
  • 【T-MRMSM】文本引导多层次交互多尺度空间记忆融合多模态情感分析
  • 基于cesium实现鼠标移动动态绘制矩形和圆
  • Rust 学习笔记:函数和控制流
  • React 中什么时候用事件总线
  • 微信小程序直传阿里云 OSS 实践指南(V4 签名 · 秒传支持 · 高性能封装)
  • ROS1、ROS2如何把预编译好的二进制文件封装成功能包?
  • 【Django】新增字段后兼容旧接口 This field is required