Rumah > Peranti teknologi > AI > Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

王林
Lepaskan: 2023-04-14 12:28:03
ke hadapan
3676 orang telah melayarinya

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

ChatGPT telah menjadi popular baru-baru ini, dan bos juga bersedia meminta kami menyambungkan ChatGPT ke Feishu Selepas penyelidikan pagi, akhirnya kami berjaya mendaftar dan menyambungkan robot Feishu ke ChatGPT .

Yang berikut akan berkongsi dengan anda langkah terperinci untuk mengakses Feishu.

Cara mengakses Feishu

Interaksi antara Feishu dan chatgpt adalah seperti berikut. Perkhidmatan tersuai kami bertindak sebagai orang tengah untuk memajukan mesej.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

Buat robot Feishu

1 Masukkan platform terbuka Feishu dan pilih untuk mencipta aplikasi binaan sendiri untuk perusahaan.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

2. Selepas mencipta aplikasi, klik untuk memasuki aplikasi dan menambah robot.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

3 Konfigurasikan kebenaran berkaitan mesej untuk robot Jika anda tidak pasti kebenaran yang diperlukan, anda boleh mendayakannya terlebih dahulu.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

4. Langganan acara memerlukan terlebih dahulu membangunkan antara muka untuk disahkan oleh Feishu. Antara muka perlu boleh diakses daripada rangkaian awam.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

Kod antara muka ini boleh dirujuk seperti berikut:

@PostMapping(value = "/message")
public FeishuEventDTO message(@RequestBody String body) {
log.info("收到消息:{}", body);
FeishuEventParams feishuEventParams = JSON.parseObject(body, FeishuEventParams.class);
FeishuEventDTO eventDTO = new FeishuEventDTO();
eventDTO.setChallenge(feishuEventParams.getChallenge());
return eventDTO;
}

@Data
public class FeishuEventParams {

private String challenge;
private String token;
private String type;
}

@Data
public class FeishuEventDTO {
private String challenge;
}
Salin selepas log masuk

Satu perkara yang perlu diambil perhatian ialah antara muka pengesahan ini dan berikut terima fly Antara muka mesej buku adalah alamat yang sama, tetapi isi mesej berbeza.

Maksudnya, antara muka pengesahan adalah penggunaan sekali sahaja dan perlu diubah suai selepas pengesahan.

Kami mula-mula menerbitkan antara muka ini kepada projek yang boleh diakses daripada rangkaian awam Contohnya, alamat antara muka ialah
​//m.sbmmt.com/link/. 4aee31b0ec9f7bb7885473d95961e9a6​

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

OK, kini konfigurasi Feishu pada asasnya telah selesai.

Logik dan pelaksanaan dok

Biar saya bercakap dahulu tentang logik umum dok syarikat kami untuk rujukan anda.

Selepas pengguna menghantar mesej kepada Feishu, Feishu akan memajukan mesej itu ke perkhidmatan kami sendiri.

Tetapi akan ada masalah di sini, iaitu, apabila berbilang pengguna memulakan perbualan secara serentak, atau apabila ramai orang dalam kumpulan besar adalah robot @kami, kami perlu mengingati balasan setiap orang dan menanyakannya dalam chatgpt Selepas mendapatkan keputusan, balas orang ini dengan tepat.

Memandangkan syarikat kami sedang menggunakannya untuk ujian dalaman dan tidak mahu pelaksanaannya terlalu rumit, idea yang kami pakai ialah: apabila setiap sesi pengguna dimajukan ke perkhidmatan kami, kandungan sesi disimpan dahulu ke baris gilir ConcurrentLinkedQueue global, dan kemudian mulakan urutan untuk terus menggunakan baris gilir ini.

Jenis baris gilir generik ialah objek yang dibina terlebih dahulu Objek ini menyimpan ID mesej mesej semasa, pengirim, kandungan soalan, dsb.

Setiap kali objek digunakan, kandungan soalan objek dihantar ke chatgpt Selepas mendapat keputusan respons, antara muka sesi balasan yang disediakan oleh Feishu dipanggil untuk membalas kepada pengguna. (Jika jumlah konkurensi agak besar, ia boleh dibuat tak segerak di sini).

Baiklah, itulah idea umum.

1. Buka projek kami dan perkenalkan balang yang disediakan oleh chatgpt.

<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>service</artifactId>
<version>0.10.0</version>
</dependency>
Salin selepas log masuk

2. Tulis semula antara muka pengesahan di atas dan tukar untuk menerima mesej Feishu. (Jangan ubah laluan antara muka)

@Slf4j
@RestController
@RequestMapping(value = "/query")
public class QureyController {

public static ConcurrentLinkedQueue<FeishuResponse> consumer 
= new ConcurrentLinkedQueue<>();

@PostMapping(value = "/message")
public String message(@RequestBody String body) {
log.info("收到飞书消息:{}", body);
JSONObject jsonObject = JSONObject.parseObject(body);
JSONObject header = jsonObject.getJSONObject("header");
String eventType = header.getString("event_type");
if ("im.message.receive_v1".equals(eventType)) {
JSONObject event = jsonObject.getJSONObject("event");
JSONObject message = event.getJSONObject("message");
String messageType = message.getString("message_type");
if ("text".equals(messageType)) {
String messageId = message.getString("message_id");
String content = message.getString("content");
JSONObject contentJson = JSON.parseObject(content);
String text = contentJson.getString("text");

FeishuResponse feishuResponse = new FeishuResponse();
feishuResponse.setMessageId(messageId);
feishuResponse.setQuery(text);
log.info("投递用户消息,{}", JSON.toJSON(feishuResponse));
consumer.add(feishuResponse);
} else {
log.info("非文本消息");
}
}

return "suc";
}
}
Salin selepas log masuk

Struktur FeishuResponse adalah seperti berikut.

@Data
public class FeishuResponse {

private String messageId;

private String query;

}
Salin selepas log masuk

3. Tulis urutan tugasan.

@Slf4j
public class AutoSendTask implements Runnable {
//你的chatgpt的key
public static final String token = "";
public static OpenAiService openAiService = null;

static {
openAiService = new OpenAiService(token, Duration.ofSeconds(60));
}

@Override
public void run() {
while (true) {
try {
FeishuResponse poll = consumer.poll();
if (poll == null) {
log.info("no query,sleep 2s");
TimeUnit.SECONDS.sleep(2);
} else {
String query = this.query(poll.getQuery());
this.reply(poll, query);
}
} catch (InterruptedException e) {
log.error("Thread exception...", e);
}
}
}

private String query(String q) {
log.info("开始提问:{}", q);
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt(q)
.model("text-davinci-003")
.maxTokens(2048)
.echo(false)
.build();
StringBuilder sb = new StringBuilder();
CompletionResult completion = openAiService.createCompletion(completionRequest);
log.info("q:{},获取响应:{}", q, JSON.toJSONString(completion));
completion.getChoices().forEach(v -> {
sb.append(v.getText());
});
String rs = sb.toString();
if (rs.startsWith("?")) {
rs = rs.replaceFirst("?", "");
}
if (rs.startsWith("nn")) {
rs = rs.replaceFirst("nn", "");
}
log.info("格式化后的rs:{}", rs);
return rs;
}

private String reply(FeishuResponse poll, String rs) {
JSONObject params = new JSONObject();
params.put("uuid", RandomUtil.randomNumbers(10));
params.put("msg_type", "text");

JSONObject content = new JSONObject();
content.put("text", rs);
params.put("content", content.toJSONString());

String url = String.format("https://open.feishu.cn/open-apis/im/v1/messages/%s/reply",
 poll.getMessageId());
String tenantAccessToken = FeishuUtils.getTenantAccessToken();
String body = null;
try (HttpResponse authorization = HttpUtil.createPost(url)
.header("Authorization", "Bearer " + tenantAccessToken)
.body(params.toJSONString())
.execute()) {
body = authorization.body();
}

return body;
}

}
Salin selepas log masuk

Kelas alat untuk mendapatkan token Feishu adalah seperti berikut:

@Slf4j
public class FeishuUtils {

public static final String tokenUrl
= "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/";
//构建一个cache 缓存飞书的token
static Cache<String, String> tokenCache =
CacheBuilder.newBuilder().expireAfterWrite(Duration.ofSeconds(3500)).build();
//这个是飞书应用的appid和key,可以在创建的飞书应用中找到
public static final String appId = "";
public static final String appKey = "";

public static String getTenantAccessToken() {
String token = null;
try {
token = tokenCache.get("token", () -> {
JSONObject params = new JSONObject();
params.put("app_id", appId);
params.put("app_secret", appKey);
String body;
try (HttpResponse execute = HttpUtil.createPost(tokenUrl)
.body(params.toJSONString()).execute()) {
body = execute.body();
}
log.info("获取飞书token:{}", body);
if (StrUtil.isNotBlank(body)) {
String tenantAccessToken = JSON.parseObject(body).getString("tenant_access_token");
tokenCache.put("token", tenantAccessToken);
return tenantAccessToken;
}
return null;
});
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
return token;
}
}
Salin selepas log masuk

4 sahaja.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

Akhir sekali, atas sebab privasi, kesan perbualan kumpulan chatgpt tidak akan dipaparkan Mari tunjukkan kesan perbualan langsung dengan robot.

Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu

Akhirnya

Memandangkan kami hanya memperkenalkan chatgpt dengan sikap cuba-cuba, kodnya agak kasar kalau ada apa-apa yang tak kena dengan penulisan, , saya harap semua orang akan faham.

Balang tambahan yang diperkenalkan dalam kod dalam artikel ini termasuk: jambu batu, hutool-all dan fastjson.

Atas ialah kandungan terperinci Kod dilampirkan, langkah terperinci untuk menyambungkan ChatGPT ke Feishu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan