| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- //package com.ruoyi.aicall.utils;
- //
- //import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
- //import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
- //import software.amazon.awssdk.core.SdkBytes;
- //import software.amazon.awssdk.regions.Region;
- //import software.amazon.awssdk.services.bedrockruntime.BedrockRuntimeClient;
- //import software.amazon.awssdk.services.bedrockruntime.BedrockRuntimeAsyncClient;
- //import software.amazon.awssdk.services.bedrockruntime.model.*;
- //import software.amazon.awssdk.core.async.SdkPublisher;
- //
- //import java.util.ArrayList;
- //import java.util.Arrays;
- //import java.util.List;
- //import java.util.concurrent.CompletableFuture;
- //import java.util.concurrent.ExecutionException;
- //
- ///**
- // * AWS Bedrock Claude 模型调用工具类
- // * 支持 Claude 3 (Haiku, Sonnet, Opus) 和 Claude 2 系列模型
- // */
- //public class AwsClaudeClient implements AutoCloseable {
- //
- // private final BedrockRuntimeClient bedrockClient;
- // private final BedrockRuntimeAsyncClient asyncClient;
- // private final String modelId;
- //
- // // 常用模型ID常量
- // public static final String CLAUDE_3_5_SONNET = "anthropic.claude-3-5-sonnet-20240620-v1:0";
- // public static final String CLAUDE_3_OPUS = "anthropic.claude-3-opus-20240229-v1:0";
- // public static final String CLAUDE_3_SONNET = "anthropic.claude-3-sonnet-20240229-v1:0";
- // public static final String CLAUDE_3_HAIKU = "anthropic.claude-3-haiku-20240307-v1:0";
- // public static final String CLAUDE_2_1 = "anthropic.claude-v2:1";
- // public static final String CLAUDE_2 = "anthropic.claude-v2";
- // public static final String CLAUDE_INSTANT = "anthropic.claude-instant-v1";
- //
- // /**
- // * 构造函数
- // *
- // * @param accessKey AWS Access Key
- // * @param secretKey AWS Secret Key
- // * @param region AWS 区域 (如 Region.US_EAST_1)
- // * @param modelId 模型ID,可使用本类提供的常量
- // */
- // public AwsClaudeClient(String accessKey, String secretKey, Region region, String modelId) {
- // AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
- // StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(credentials);
- //
- // this.bedrockClient = BedrockRuntimeClient.builder()
- // .region(region)
- // .credentialsProvider(credentialsProvider)
- // .build();
- //
- // this.asyncClient = BedrockRuntimeAsyncClient.builder()
- // .region(region)
- // .credentialsProvider(credentialsProvider)
- // .build();
- //
- // this.modelId = modelId;
- // }
- //
- // /**
- // * 简单文本对话(Claude 3 版本)
- // *
- // * @param userMessage 用户输入的消息
- // * @return 模型的回复文本
- // */
- // public String chat(String userMessage) {
- // return chat(userMessage, 1024, 0.7);
- // }
- //
- // /**
- // * 带参数控制的文本对话(Claude 3 版本)
- // *
- // * @param userMessage 用户输入的消息
- // * @param maxTokens 最大生成token数
- // * @param temperature 温度参数 (0.0 - 1.0)
- // * @return 模型的回复文本
- // */
- // public String chat(String userMessage, int maxTokens, double temperature) {
- // // 构建 Claude 3 消息格式
- // String payload = String.format(
- // "{" +
- // "\"anthropic_version\": \"bedrock-2023-05-31\"," +
- // "\"max_tokens\": %d," +
- // "\"temperature\": %.2f," +
- // "\"messages\": [" +
- // " {\"role\": \"user\", \"content\": \"%s\"}" +
- // "]" +
- // "}",
- // maxTokens, temperature, escapeJson(userMessage)
- // );
- //
- // return invokeModel(payload);
- // }
- //
- // /**
- // * 多轮对话(Claude 3 版本)
- // *
- // * @param messages 消息列表,包含 role 和 content
- // * @param maxTokens 最大生成token数
- // * @param temperature 温度参数
- // * @return 模型的回复文本
- // */
- // public String chat(List<Message> messages, int maxTokens, double temperature) {
- // StringBuilder messagesJson = new StringBuilder();
- // for (int i = 0; i < messages.size(); i++) {
- // Message msg = messages.get(i);
- // messagesJson.append(String.format(
- // "{\"role\": \"%s\", \"content\": \"%s\"}",
- // msg.getRole(), escapeJson(msg.getContent())
- // ));
- // if (i < messages.size() - 1) {
- // messagesJson.append(",");
- // }
- // }
- //
- // String payload = String.format(
- // "{" +
- // "\"anthropic_version\": \"bedrock-2023-05-31\"," +
- // "\"max_tokens\": %d," +
- // "\"temperature\": %.2f," +
- // "\"messages\": [%s]" +
- // "}",
- // maxTokens, temperature, messagesJson.toString()
- // );
- //
- // return invokeModel(payload);
- // }
- //
- // /**
- // * 流式调用(使用异步客户端)
- // *
- // * @param userMessage 用户消息
- // * @param callback 流式响应回调
- // */
- // public void chatStream(String userMessage, StreamCallback callback) {
- // String payload = String.format(
- // "{" +
- // "\"anthropic_version\": \"bedrock-2023-05-31\"," +
- // "\"max_tokens\": 4096," +
- // "\"messages\": [" +
- // " {\"role\": \"user\", \"content\": \"%s\"}" +
- // "]" +
- // "}",
- // escapeJson(userMessage)
- // );
- //
- // InvokeModelWithResponseStreamRequest request = InvokeModelWithResponseStreamRequest.builder()
- // .modelId(modelId)
- // .body(SdkBytes.fromUtf8String(payload))
- // .build();
- //
- // // 使用异步客户端进行流式调用
- // CompletableFuture<Void> future = asyncClient.invokeModelWithResponseStream(request,
- // new InvokeModelWithResponseStreamResponseHandler() {
- //
- // @Override
- // public void responseReceived(InvokeModelWithResponseStreamResponse invokeModelWithResponseStreamResponse) {
- //
- // }
- //
- // @Override
- // public void onEventStream(SdkPublisher<ResponseStream> publisher) {
- // publisher.subscribe(event -> {
- // if (event instanceof PayloadPart) {
- // PayloadPart payloadPart = (PayloadPart) event;
- // String chunk = payloadPart.bytes().asUtf8String();
- // String content = extractContentFromChunk(chunk);
- // if (content != null && !content.isEmpty()) {
- // callback.onChunkReceived(content);
- // }
- // }
- // });
- // }
- //
- // @Override
- // public void exceptionOccurred(Throwable throwable) {
- // callback.onError(throwable);
- // }
- //
- // @Override
- // public void complete() {
- // callback.onComplete();
- // }
- // });
- //
- // // 等待流式调用完成
- // try {
- // future.get();
- // } catch (InterruptedException | ExecutionException e) {
- // throw new RuntimeException("流式调用失败", e);
- // }
- // }
- //
- // /**
- // * 调用模型并解析响应
- // */
- // private String invokeModel(String payload) {
- // InvokeModelRequest request = InvokeModelRequest.builder()
- // .modelId(modelId)
- // .body(SdkBytes.fromUtf8String(payload))
- // .build();
- //
- // InvokeModelResponse response = bedrockClient.invokeModel(request);
- // String responseBody = response.body().asUtf8String();
- //
- // return extractContent(responseBody);
- // }
- //
- // /**
- // * 从响应 JSON 中提取 content 文本
- // */
- // private String extractContent(String jsonResponse) {
- // // Claude 3 格式处理
- // int contentStart = jsonResponse.indexOf("\"content\":");
- // if (contentStart != -1) {
- // int textStart = jsonResponse.indexOf("\"text\":", contentStart);
- // if (textStart != -1) {
- // int quoteStart = jsonResponse.indexOf("\"", textStart + 7) + 1;
- // int quoteEnd = jsonResponse.indexOf("\"", quoteStart);
- // if (quoteStart > 0 && quoteEnd > quoteStart) {
- // return unescapeJson(jsonResponse.substring(quoteStart, quoteEnd));
- // }
- // }
- // }
- //
- // // Claude 2 格式处理
- // int completionStart = jsonResponse.indexOf("\"completion\":");
- // if (completionStart != -1) {
- // int quoteStart = jsonResponse.indexOf("\"", completionStart + 13) + 1;
- // int quoteEnd = jsonResponse.lastIndexOf("\"");
- // if (quoteStart > 0 && quoteEnd > quoteStart) {
- // return unescapeJson(jsonResponse.substring(quoteStart, quoteEnd));
- // }
- // }
- //
- // return jsonResponse;
- // }
- //
- // /**
- // * 从流式响应块中提取内容
- // */
- // private String extractContentFromChunk(String chunk) {
- // // 流式响应通常是 JSON 行格式
- // if (chunk.contains("\"type\":\"content_block_delta\"") || chunk.contains("\"delta\"")) {
- // int textStart = chunk.indexOf("\"text\":");
- // if (textStart != -1) {
- // int quoteStart = chunk.indexOf("\"", textStart + 7) + 1;
- // int quoteEnd = chunk.indexOf("\"", quoteStart);
- // if (quoteStart > 0 && quoteEnd > quoteStart) {
- // return unescapeJson(chunk.substring(quoteStart, quoteEnd));
- // }
- // }
- // }
- // return chunk;
- // }
- //
- // /**
- // * JSON 字符串转义
- // */
- // private String escapeJson(String input) {
- // if (input == null) return "";
- // return input.replace("\\", "\\\\")
- // .replace("\"", "\\\"")
- // .replace("\n", "\\n")
- // .replace("\r", "\\r")
- // .replace("\t", "\\t");
- // }
- //
- // /**
- // * JSON 字符串反转义
- // */
- // private String unescapeJson(String input) {
- // if (input == null) return "";
- // return input.replace("\\\"", "\"")
- // .replace("\\n", "\n")
- // .replace("\\r", "\r")
- // .replace("\\t", "\t")
- // .replace("\\\\", "\\");
- // }
- //
- // @Override
- // public void close() {
- // bedrockClient.close();
- // asyncClient.close();
- // }
- //
- // // ==================== 内部类和接口 ====================
- //
- // /**
- // * 消息对象,用于多轮对话
- // */
- // public static class Message {
- // private final String role; // "user" 或 "assistant"
- // private final String content;
- //
- // public Message(String role, String content) {
- // this.role = role;
- // this.content = content;
- // }
- //
- // public String getRole() { return role; }
- // public String getContent() { return content; }
- //
- // public static Message user(String content) {
- // return new Message("user", content);
- // }
- //
- // public static Message assistant(String content) {
- // return new Message("assistant", content);
- // }
- // }
- //
- // /**
- // * 流式响应回调接口
- // */
- // public interface StreamCallback {
- // void onChunkReceived(String chunk);
- // void onError(Throwable throwable);
- // void onComplete();
- // }
- //
- // // ==================== 使用示例 ====================
- //
- // public static void main(String[] args) {
- // // 配置参数(建议从配置文件或环境变量读取)
- // String accessKey = "AKIAZSHZ4G4NU37EOYFT";
- // String secretKey = "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";
- // Region region = Region.US_EAST_1; // Bedrock 主要在此区域
- //
- // try (AwsClaudeClient client = new AwsClaudeClient(
- // accessKey, secretKey, region, CLAUDE_3_5_SONNET)) {
- //
- // // 1. 简单调用
- // System.out.println("=== 简单调用 ===");
- // String response = client.chat("你好,请介绍一下你自己");
- // System.out.println("响应: " + response);
- //
- // // 2. 带参数调用
- // System.out.println("\n=== 带参数调用 ===");
- // String response2 = client.chat(
- // "写一首关于春天的诗",
- // 2048, // 最大token
- // 0.9 // 更高的创造性
- // );
- // System.out.println("诗歌: " + response2);
- //
- // // 3. 多轮对话
- // System.out.println("\n=== 多轮对话 ===");
- // List<Message> messages = Arrays.asList(
- // Message.user("你好"),
- // Message.assistant("你好!有什么我可以帮助你的吗?"),
- // Message.user("请用 Java 写一个单例模式")
- // );
- // String multiTurnResponse = client.chat(messages, 2048, 0.7);
- // System.out.println("多轮响应: " + multiTurnResponse);
- //
- // // 4. 流式调用
- // System.out.println("\n=== 流式调用 ===");
- // client.chatStream("请详细解释 Java 的内存模型,包括堆、栈、方法区等", new StreamCallback() {
- // @Override
- // public void onChunkReceived(String chunk) {
- // System.out.print(chunk);
- // }
- //
- // @Override
- // public void onError(Throwable throwable) {
- // System.err.println("流式调用出错: " + throwable.getMessage());
- // }
- //
- // @Override
- // public void onComplete() {
- // System.out.println("\n[流式调用完成]");
- // }
- // });
- //
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // }
- //}
|