diff --git a/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/IOpenAI.java b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/IOpenAI.java new file mode 100644 index 0000000000000000000000000000000000000000..e2cc5a5bf28df03202cda0d98ec71511285c6958 --- /dev/null +++ b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/IOpenAI.java @@ -0,0 +1,15 @@ +package cn.bugstack.chatbot.api.domain.ai; + +import java.io.IOException; + +/** + * @author 小傅哥,微信:fustack + * @description ChatGPT open ai 接口:https://beta.openai.com/account/api-keys + * @github https://github.com/fuzhengwei + * @Copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获! + */ +public interface IOpenAI { + + String doChatGPT(String question) throws IOException; + +} diff --git a/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/model/aggregates/AIAnswer.java b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/model/aggregates/AIAnswer.java new file mode 100644 index 0000000000000000000000000000000000000000..431d03348f7a4f8840425bc34dedec0ed2f6f47f --- /dev/null +++ b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/model/aggregates/AIAnswer.java @@ -0,0 +1,56 @@ +package cn.bugstack.chatbot.api.domain.ai.model.aggregates; + +import cn.bugstack.chatbot.api.domain.ai.model.vo.Choices; + +import java.util.List; + +/** + * @author 小傅哥,微信:fustack + * @description AI Answer + * @github https://github.com/fuzhengwei + * @copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获! + */ +public class AIAnswer { + + private String id; + + private String object; + + private int created; + + private String model; + + private List choices; + + public void setId(String id){ + this.id = id; + } + public String getId(){ + return this.id; + } + public void setObject(String object){ + this.object = object; + } + public String getObject(){ + return this.object; + } + public void setCreated(int created){ + this.created = created; + } + public int getCreated(){ + return this.created; + } + public void setModel(String model){ + this.model = model; + } + public String getModel(){ + return this.model; + } + public void setChoices(List choices){ + this.choices = choices; + } + public List getChoices(){ + return this.choices; + } + +} diff --git a/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/model/vo/Choices.java b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/model/vo/Choices.java new file mode 100644 index 0000000000000000000000000000000000000000..1717bb1e33da4879e1b92c7ed4c24d5bc0292428 --- /dev/null +++ b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/model/vo/Choices.java @@ -0,0 +1,50 @@ +package cn.bugstack.chatbot.api.domain.ai.model.vo; + +/** + * @author 小傅哥,微信:fustack + * @description 选择 + * @github https://github.com/fuzhengwei + * @Copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获! + */ +public class Choices { + + private String text; + + private int index; + + private String logprobs; + + private String finish_reason; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public String getLogprobs() { + return logprobs; + } + + public void setLogprobs(String logprobs) { + this.logprobs = logprobs; + } + + public String getFinish_reason() { + return finish_reason; + } + + public void setFinish_reason(String finish_reason) { + this.finish_reason = finish_reason; + } +} diff --git a/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/service/OpenAI.java b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/service/OpenAI.java new file mode 100644 index 0000000000000000000000000000000000000000..7713465fa4669931871611d8491d86e58c2f0ab3 --- /dev/null +++ b/chatbot-api-domain/src/main/java/cn/bugstack/chatbot/api/domain/ai/service/OpenAI.java @@ -0,0 +1,66 @@ +package cn.bugstack.chatbot.api.domain.ai.service; + +import cn.bugstack.chatbot.api.domain.ai.IOpenAI; +import cn.bugstack.chatbot.api.domain.ai.model.aggregates.AIAnswer; +import cn.bugstack.chatbot.api.domain.ai.model.vo.Choices; +import com.alibaba.fastjson.JSON; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.List; + +/** + * @author 小傅哥,微信:fustack + * @description + * @github https://github.com/fuzhengwei + * @Copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获! + */ +@Service +public class OpenAI implements IOpenAI { + + private Logger logger = LoggerFactory.getLogger(OpenAI.class); + + @Value("${chatbot-api.openAiKey}") + private String openAiKey; + + @Override + public String doChatGPT(String question) throws IOException { + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + HttpPost post = new HttpPost("https://api.openai.com/v1/completions"); + post.addHeader("Content-Type", "application/json"); + post.addHeader("Authorization", "Bearer " + openAiKey); + + String paramJson = "{\"model\": \"text-davinci-003\", \"prompt\": \"" + question + "\", \"temperature\": 0, \"max_tokens\": 1024}"; + + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("text/json", "UTF-8")); + post.setEntity(stringEntity); + + CloseableHttpResponse response = httpClient.execute(post); + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + String jsonStr = EntityUtils.toString(response.getEntity()); + AIAnswer aiAnswer = JSON.parseObject(jsonStr, AIAnswer.class); + StringBuilder answers = new StringBuilder(); + List choices = aiAnswer.getChoices(); + for (Choices choice : choices) { + answers.append(choice.getText()); + } + return answers.toString(); + } else { + throw new RuntimeException("api.openai.com Err Code is " + response.getStatusLine().getStatusCode()); + } + } + +} diff --git a/chatbot-api-interfaces/src/main/resources/application.yml b/chatbot-api-interfaces/src/main/resources/application.yml index afd84ade05645e5305b689ca6f053cb0bec06cfe..0aa062ade344c3f994c18d20c4dda04680e59dc9 100644 --- a/chatbot-api-interfaces/src/main/resources/application.yml +++ b/chatbot-api-interfaces/src/main/resources/application.yml @@ -3,4 +3,5 @@ server: chatbot-api: groupId: 28885518425541 - cookie: __cuid=5330a556392a4c5b8084b4cbc165e0f3; amp_fef1e8=930aec23-e22e-4f11-8864-0389bd5095d1R...1g55hl79m.1g55hl79t.1.1.2; UM_distinctid=183e61195d535b-0bddac94679c75-19525635-1aeaa0-183e61195d7c52; sensorsdata2015jssdkcross={"distinct_id":"241858242255511","first_id":"17ebd0b4317ecb-0b27f672c2d3af-133a6253-1296000-17ebd0b4318ba7","props":{"$latest_traffic_source_type":"直接流量","$latest_search_keyword":"未取到值_直接打开","$latest_referrer":""},"$device_id":"17ebd0b4317ecb-0b27f672c2d3af-133a6253-1296000-17ebd0b4318ba7","identities":"eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTgwMmQ2YjZiOWIxZjMtMGQ4YzMzZjhmYTA3YmEtMzU3MzZhMDMtMTI5NjAwMC0xODAyZDZiNmI5YzEwODYiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIyNDE4NTgyNDIyNTU1MTEifQ==","history_login_id":{"name":"$identity_login_id","value":"241858242255511"}}; abtest_env=product; zsxqsessionid=8fae9a083a4874ab833c2158a44deb82; zsxq_access_token=5D862869-1229-A9B6-1BC1-C662EC4B16DD_D625BA7FD9CBBDFA \ No newline at end of file + cookie: __cuid=5330a556392a4c5b8084b4cbc165e0f3; amp_fef1e8=930aec23-e22e-4f11-8864-0389bd5095d1R...1g55hl79m.1g55hl79t.1.1.2; UM_distinctid=183e61195d535b-0bddac94679c75-19525635-1aeaa0-183e61195d7c52; sensorsdata2015jssdkcross={"distinct_id":"241858242255511","first_id":"17ebd0b4317ecb-0b27f672c2d3af-133a6253-1296000-17ebd0b4318ba7","props":{"$latest_traffic_source_type":"直接流量","$latest_search_keyword":"未取到值_直接打开","$latest_referrer":""},"$device_id":"17ebd0b4317ecb-0b27f672c2d3af-133a6253-1296000-17ebd0b4318ba7","identities":"eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTgwMmQ2YjZiOWIxZjMtMGQ4YzMzZjhmYTA3YmEtMzU3MzZhMDMtMTI5NjAwMC0xODAyZDZiNmI5YzEwODYiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIyNDE4NTgyNDIyNTU1MTEifQ==","history_login_id":{"name":"$identity_login_id","value":"241858242255511"}}; abtest_env=product; zsxqsessionid=8fae9a083a4874ab833c2158a44deb82; zsxq_access_token=5D862869-1229-A9B6-1BC1-C662EC4B16DD_D625BA7FD9CBBDFA + openAiKey: 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 \ No newline at end of file diff --git a/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/ApiTest.java b/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/ApiTest.java index 6defd311a6f02c5d802ca906d35b25461bfc4ca8..d991b3fd61ed4881cea4c1c1a428a20e1aa1abc4 100644 --- a/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/ApiTest.java +++ b/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/ApiTest.java @@ -27,7 +27,7 @@ public class ApiTest { HttpGet get = new HttpGet("https://api.zsxq.com/v2/groups/28885518425541/topics?scope=unanswered_questions&count=20"); - get.addHeader("cookie", "__cuid=5330a556392a4c5b8084b4cbc165e0f3; amp_fef1e8=930aec23-e22e-4f11-8864-0389bd5095d1R...1g55hl79m.1g55hl79t.1.1.2; UM_distinctid=183e61195d535b-0bddac94679c75-19525635-1aeaa0-183e61195d7c52; sensorsdata2015jssdkcross={\"distinct_id\":\"241858242255511\",\"first_id\":\"17ebd0b4317ecb-0b27f672c2d3af-133a6253-1296000-17ebd0b4318ba7\",\"props\":{\"$latest_traffic_source_type\":\"直接流量\",\"$latest_search_keyword\":\"未取到值_直接打开\",\"$latest_referrer\":\"\"},\"$device_id\":\"17ebd0b4317ecb-0b27f672c2d3af-133a6253-1296000-17ebd0b4318ba7\",\"identities\":\"eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTgwMmQ2YjZiOWIxZjMtMGQ4YzMzZjhmYTA3YmEtMzU3MzZhMDMtMTI5NjAwMC0xODAyZDZiNmI5YzEwODYiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIyNDE4NTgyNDIyNTU1MTEifQ==\",\"history_login_id\":{\"name\":\"$identity_login_id\",\"value\":\"241858242255511\"}}; abtest_env=product; zsxqsessionid=8fae9a083a4874ab833c2158a44deb82; zsxq_access_token=5D862869-1229-A9B6-1BC1-C662EC4B16DD_D625BA7FD9CBBDFA"); + get.addHeader("cookie", ""); get.addHeader("Content-Type", "application/json;charset=utf8"); CloseableHttpResponse response = httpClient.execute(get); @@ -67,4 +67,27 @@ public class ApiTest { } } + @Test + public void test_chatGPT() throws IOException { + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + HttpPost post = new HttpPost("https://api.openai.com/v1/completions"); + post.addHeader("Content-Type", "application/json"); + post.addHeader("Authorization", "Bearer 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"); + + String paramJson = "{\"model\": \"text-davinci-003\", \"prompt\": \"帮我写一个java冒泡排序\", \"temperature\": 0, \"max_tokens\": 1024}"; + + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("text/json", "UTF-8")); + post.setEntity(stringEntity); + + CloseableHttpResponse response = httpClient.execute(post); + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + String res = EntityUtils.toString(response.getEntity()); + System.out.println(res); + } else { + System.out.println(response.getStatusLine().getStatusCode()); + } + + } + } diff --git a/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/SpringBootRunTest.java b/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/SpringBootRunTest.java index 32c8ce1cfaada636fbc9d5f0280250755c0df2f7..8c5621792d517d2b65ddb0da95ea49d4a42e7d85 100644 --- a/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/SpringBootRunTest.java +++ b/chatbot-api-interfaces/src/test/java/cn/bugstack/chatbot/api/test/SpringBootRunTest.java @@ -1,5 +1,6 @@ package cn.bugstack.chatbot.api.test; +import cn.bugstack.chatbot.api.domain.ai.IOpenAI; import cn.bugstack.chatbot.api.domain.zsxq.IZsxqApi; import cn.bugstack.chatbot.api.domain.zsxq.model.aggregates.UnAnsweredQuestionsAggregates; import cn.bugstack.chatbot.api.domain.zsxq.model.vo.Topics; @@ -35,6 +36,8 @@ public class SpringBootRunTest { @Resource private IZsxqApi zsxqApi; + @Resource + private IOpenAI openAI; @Test public void test_zsxqApi() throws IOException { @@ -52,4 +55,10 @@ public class SpringBootRunTest { } } + @Test + public void test_openAi() throws IOException { + String response = openAI.doChatGPT("帮我写一个java冒泡排序"); + logger.info("测试结果:{}", response); + } + }