本项目工程是用2022.3.17f1c1,亲测可用,工程在附件链接里。
资源均来源于网络,仅供学习和参考使用,版权归原作者所有,勿作商业用途,请在下载后24小时之内自觉删除。
本站发布的内容若无意中侵犯到您的权益,请联系我们,本站将在看到后立即删除。
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Events;
- using UnityEngine.Networking;
- /// <summary>
- /// ChatGpt的管理器。
- /// </summary>
- public class ChatGptManager : MonoBehaviour
- {
- //构造方法私有化,防止外部new对象。
- private ChatGptManager() { }
- //提供一个属性给外部访问,这个属性就相当于是单例对象。
- private static ChatGptManager instance;
- public static ChatGptManager Instance
- {
- get
- {
- if (instance==null)
- {
- instance = FindObjectOfType<ChatGptManager>();
- if (instance == null)
- {
- GameObject go = new GameObject("ChatGptManager");//创建游戏对象
- instance=go.AddComponent<ChatGptManager>();//挂载脚本到游戏对象身上
- DontDestroyOnLoad(go);
- }
- }
- return instance;
- }
- }
- //要调用ChatGpt的API的网址。
- //string chatGptUrl = "https://use.52apikey.cn/v1/chat/completions";
- //https://my.52apikey.cn/ 令牌key查询
- string chatGptUrl = "https://api.openai.com/v1/chat/completions";
- //使用的ChatGPT的模型
- //string chatGptModel = "gpt-3.5-turbo";
- string chatGptModel = "gpt-4o-mini";
- //使用的ChatGPT的API Key
- string chatGptApiKey = "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-phS90j9w3JegjDorN9qwldpxF3DWJNTAy6vCqiDE1JP9D8Ld";
- //AI人设的提示词
- public string aiRolePrompt = "和我是青梅竹马的女孩子";
- //与ChatGPT的聊天记录。
- public List<PostDataBody> chatRecords = new List<PostDataBody>();
- void Awake()
- {
- //给AI设定的人设。
- chatRecords.Add(new PostDataBody("system", aiRolePrompt));
- }
- /// <summary>
- /// 异步向ChatGPT发送消息(不连续对话)
- /// </summary>
- /// <param name="message">询问ChatGPT的内容</param>
- /// <param name="callback">回调</param>
- /// <param name="aiRole">ChatGPT要扮演的角色</param>
- public void ChatDiscontinuously(string message,UnityAction<string> callback,string aiRole="")
- {
- //构造要发送的数据。
- PostData postData = new PostData
- {
- //使用的ChatGPT的模型
- model = chatGptModel,
- //要发送的消息
- messages = new List<PostDataBody>()
- {
- new PostDataBody("system",aiRole),
- new PostDataBody("user",message)
- }
- };
- //异步向ChatGPT发送数据。
- SendPostData(postData, callback);
- }
- /// <summary>
- /// 异步向ChatGPT发送消息(连续对话)
- /// </summary>
- /// <param name="message">询问ChatGPT的内容</param>
- /// <param name="callback">回调</param>
- public void ChatContinuously(string message,UnityAction<string> callback)
- {
- //缓存聊天记录
- chatRecords.Add(new PostDataBody("user",message));
- //构造要发送的数据。
- PostData postData = new PostData
- {
- //使用的ChatGPT的模型
- model = chatGptModel,
- //要发送的消息
- messages = chatRecords
- };
- //异步向ChatGPT发送数据。
- SendPostData(postData, callback);
- }
- /// <summary>
- /// 清空ChatGPT的聊天记录,并重新设置连续对话时,AI的人设。
- /// </summary>
- /// <param name="aiRolePrompt">AI的人设。我们可以用一段话来描述这个人设。</param>
- public void ClearChatRecordsAndSetAiRole(string aiRolePrompt="")
- {
- //清空聊天记录。
- chatRecords.Clear();
- //给AI设定人设。
- chatRecords.Add(new PostDataBody("system", aiRolePrompt));
- }
- public void SendPostData(PostData postData, UnityAction<string> callback)
- {
- StartCoroutine(SendPostDataCoroutine(postData,callback));
- }
- IEnumerator SendPostDataCoroutine(PostData postData, UnityAction<string> callback)
- {
- //创建一个UnityWebRequest类的对象用于发送网络请求。POST表示向服务器发送数据。using关键字用于在执行完这段语句之后释放这个UnityWebRequest类的对象。
- using (UnityWebRequest request = new UnityWebRequest(chatGptUrl, "POST"))
- {
- //把传输的消息的对象转换为JSON格式的字符串。
- string jsonString = JsonUtility.ToJson(postData);
- //把JSON格式的字符串转换为字节数组,以便进行网络传输。
- byte[] data = System.Text.Encoding.UTF8.GetBytes(jsonString);
- //设置要上传到远程服务器的主体数据。
- request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);
- //设置从远程服务器接收到的主体数据。
- request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
- //设置HTTP网络请求的标头。表示这个网络请求的正文采用JSON格式进行编码。
- request.SetRequestHeader("Content-Type", "application/json");
- //设置HTTP网络请求的标头。这里的写法是按照OpenAI官方要求来写的。
- request.SetRequestHeader("Authorization", string.Format("Bearer {0}", chatGptApiKey));
- //等待ChatGPT回复。
- yield return request.SendWebRequest();
- //回复码是200表示成功,404表示未找到,500表示服务器内部错误。
- if (request.responseCode == 200)
- {
- //获取ChatGPT回复的字符串,此时它是一个JSON格式的字符串。
- string respondedString = request.downloadHandler.text;
- //将ChatGPT回复的JSON格式的字符串转换为指定的类的对象。
- RespondedData respondedMessages = JsonUtility.FromJson<RespondedData>(respondedString);
- //如果ChatGPT有回复我们,则我们就挑第0条消息来显示。
- if (respondedMessages != null && respondedMessages.choices.Count > 0)
- {
- //获取第0条消息的字符串。
- string respondedMessage = respondedMessages.choices[0].message.content;
- //执行回调。
- callback?.Invoke(respondedMessage);
- }
- }
- }
- }
- //发送给ChatGPT的数据
- [Serializable]
- public class PostData
- {
- //使用哪一个ChatGPT的模型
- public string model;
- //发送给ChatGPT的消息。
- //如果发送的列表含有多条消息,则ChatGPT会根据上下文来回复。
- public List<PostDataBody> messages;
- }
- [Serializable]
- public class PostDataBody
- {
- //说话的角色
- public string role;
- //说话的内容
- public string content;
- //构造方法
- public PostDataBody() { }
- public PostDataBody(string role, string content)
- {
- this.role = role;
- this.content = content;
- }
- }
- //ChatGPT回复我们的数据
- [Serializable]
- public class RespondedData
- {
- public string id;
- public string created;
- public string model;
- public List<RespondedChoice> choices;
- }
- [Serializable]
- public class RespondedChoice
- {
- public RespondedDataBody message;
- public string finish_reason;
- public int index;
- }
- [Serializable]
- public class RespondedDataBody
- {
- public string role;
- public string content;
- }
- }
复制代码
|