Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

ANP Java SDK

Agent Network Protocol (ANP) Java SDK - 完整的 Java 实现。

模块结构

java/
├── anp4j/                         # 核心 SDK(纯 Java,无框架依赖)
├── anp-spring-boot-starter/       # Spring Boot Starter(自动配置)
└── anp-examples/                  # 示例代码
模块 说明 依赖
anp4j 核心 SDK,不依赖任何框架 -
anp-spring-boot-starter Spring Boot 自动配置 anp4j
anp-examples 所有示例代码 starter

快速开始

安装到本地仓库

cd java
mvn clean install -DskipTests

引用方式

不用 Spring Boot(纯 Java):

<dependency>
    <groupId>com.agentconnect</groupId>
    <artifactId>anp4j</artifactId>
    <version>1.0.0</version>
</dependency>

用 Spring Boot:

<dependency>
    <groupId>com.agentconnect</groupId>
    <artifactId>anp-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

方式一:Spring Boot(推荐)

1. 添加依赖

<dependency>
    <groupId>com.agentconnect</groupId>
    <artifactId>anp-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

2. 定义 Agent

import com.agentconnect.server.annotation.*;
import com.agentconnect.server.Context;
import org.springframework.stereotype.Component;

@Component
@AnpAgent(
    name = "Hotel Agent",
    description = "酒店预订服务",
    did = "did:wba:example.com:hotel",
    prefix = "/hotel"
)
public class HotelAgent {
    
    @Interface(name = "search", description = "搜索酒店")
    public Map<String, Object> search(Map<String, Object> params, Context ctx) {
        String city = (String) params.get("city");
        return Map.of("hotels", List.of("Hotel A", "Hotel B"));
    }
    
    @Interface(name = "book", description = "预订酒店")
    public Map<String, Object> book(Map<String, Object> params, Context ctx) {
        return Map.of("bookingId", "BK" + System.currentTimeMillis());
    }
}

3. 启动应用

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. 自动生成的端点

GET  http://localhost:8080/hotel/ad.json          # Agent 描述
GET  http://localhost:8080/hotel/interface.json   # OpenRPC 接口
POST http://localhost:8080/hotel/rpc              # JSON-RPC 端点
GET  http://localhost:8080/hotel/tools            # OpenAI Tools 格式

5. 测试

# 查看 Agent 描述
curl http://localhost:8080/hotel/ad.json | jq

# 搜索酒店
curl -X POST http://localhost:8080/hotel/rpc \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"search","params":{"city":"Tokyo"}}'

配置项 (application.yml)

anp:
  enabled: true
  base-url: https://example.com
  auth:
    enabled: false
    exempt-paths:
      - /ad.json
      - /interface.json

方式二:纯 Java(不用 Spring)

1. 添加依赖

<dependency>
    <groupId>com.agentconnect</groupId>
    <artifactId>anp4j</artifactId>
    <version>1.0.0</version>
</dependency>

2. 定义 Agent

import com.agentconnect.server.annotation.*;
import com.agentconnect.server.*;
import com.agentconnect.protocol.*;

@AnpAgent(name = "Hotel Agent", did = "did:wba:example.com:hotel")
public class HotelAgent {
    
    @Interface(name = "search")
    public Map<String, Object> search(Map<String, Object> params, Context ctx) {
        return Map.of("hotels", List.of("Hotel A", "Hotel B"));
    }
}

3. 创建 Handler 并集成 HTTP 框架

AgentConfig config = AgentConfig.builder()
    .name("Hotel Agent")
    .did("did:wba:example.com:hotel")
    .baseUrl("http://localhost:8080")
    .prefix("/hotel")
    .build();

AgentHandler handler = new AgentHandler(new HotelAgent(), config);

// 用任何 HTTP 框架(Javalin, Vert.x, Netty, 原生 HttpServer...)
// GET  /hotel/ad.json         → handler.generateAgentDescription()
// GET  /hotel/interface.json  → handler.generateOpenRpc()
// POST /hotel/rpc             → handler.handleRequest(jsonRpcRequest, callerDid)

示例:使用 Java 原生 HttpServer

参考 anp-examples/src/main/java/com/agentconnect/example/local/HotelServer.java


调用远程 Agent

使用 ANPCrawler(推荐,支持 LLM)

import com.agentconnect.crawler.*;

ANPCrawler crawler = new ANPCrawler(didDocPath, privateKeyPath);
crawler.fetchText("https://agent-connect.ai/mcp/agents/amap/ad.json");

// 列出可用方法
List<String> tools = crawler.listAvailableTools();

// 获取 OpenAI Tools 格式(给 LLM 用)
List<Map<String, Object>> openaiTools = crawler.getOpenAiTools();

// 调用方法
Map<String, Object> result = crawler.executeToolCall("maps_text_search", 
    Map.of("keywords", "咖啡厅", "city", "北京"));

使用 RemoteAgent

import com.agentconnect.client.*;

ANPClient client = new ANPClient(myDid, privateKey);
RemoteAgent agent = RemoteAgent.discover("https://example.com/hotel/ad.json", client);

Map<String, Object> result = agent.invoke("search", Map.of("city", "Tokyo"));

模块详情

anp4j - 核心 SDK

anp4j/src/main/java/com/agentconnect/
├── protocol/           # ANP 协议
│   ├── AgentConfig.java       # Agent 配置(Builder 模式)
│   ├── AgentDescription.java  # 生成 ad.json (JSON-LD)
│   ├── JsonRpc.java           # JSON-RPC 2.0
│   └── OpenRpcGenerator.java  # OpenRPC + OpenAI Tools
├── server/             # 服务端
│   ├── AgentHandler.java      # 核心请求处理器
│   ├── Context.java           # 请求上下文(DID, Session)
│   ├── SessionManager.java    # 会话管理
│   └── annotation/            # @AnpAgent, @Interface
├── client/             # 客户端
│   ├── ANPClient.java         # HTTP 客户端 + DID-WBA 认证
│   └── RemoteAgent.java       # 远程 Agent 代理
├── crawler/            # 爬虫
│   ├── ANPCrawler.java        # 爬虫式 Agent 发现
│   └── CrawlResult.java       # 结果容器
├── authentication/     # DID-WBA 认证
│   ├── DIDWBA.java
│   └── DIDWbaAuthHeader.java
└── utils/              # 工具类
    ├── CryptoTool.java        # Ed25519/ECDSA 签名
    └── DIDGenerator.java      # DID 文档生成

anp-spring-boot-starter - Spring Boot 集成

anp-spring-boot-starter/src/main/java/com/agentconnect/spring/
├── AnpAutoConfiguration.java    # 自动配置
├── AnpAgentBeanProcessor.java   # 扫描 @AnpAgent Bean
├── AnpEndpointController.java   # REST 端点控制器
├── AnpProperties.java           # 配置属性
└── DidWbaAuthFilter.java        # DID-WBA 认证过滤器

anp-examples - 示例代码

anp-examples/src/main/java/com/agentconnect/example/
├── didwba/             # DID-WBA 认证示例
│   ├── CreateDIDDocument.java     # 创建 DID 文档和密钥对
│   ├── ValidateDIDDocument.java   # 验证 DID 文档结构
│   └── AuthenticateAndVerify.java # 完整认证流程
├── client/             # 客户端示例
│   ├── RemoteAgentExample.java    # RemoteAgent 代理模式
│   └── LLMIntegrationExample.java # LLM 集成 (OpenAI Tools)
├── advanced/           # 高级功能示例
│   ├── AdvancedShopAgent.java     # 完整功能演示
│   └── AdvancedShopApplication.java
├── negotiation/        # 协议协商示例
│   └── NegotiationConceptExample.java  # 协商流程概念
├── ap2/                # AP2 支付协议示例
│   └── AP2ConceptExample.java     # 支付协议概念
├── local/              # 本地开发示例(无 Spring)
│   ├── HotelAgent.java
│   ├── HotelServer.java
│   └── HotelClient.java
├── calculator/         # Calculator 示例(@Param 注解)
├── online/             # 线上 Agent 调用
│   └── SmartAgentClient.java      # LLM 驱动的智能客户端
├── crawler/            # ANPCrawler 示例
│   └── AmapCrawlerExample.java
└── springboot/         # Spring Boot 示例
    ├── SimpleAgent.java           # 最简示例
    ├── HotelBookingAgent.java     # 酒店预订
    └── ShopAgent.java             # 购物车(Session 管理)

运行示例

DID-WBA 认证示例

# 创建 DID 文档
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.didwba.CreateDIDDocument"

# 验证 DID 文档
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.didwba.ValidateDIDDocument"

# 认证流程演示
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.didwba.AuthenticateAndVerify"

客户端示例

# 先启动服务端
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.local.HotelServer"

# 然后运行客户端(新终端)
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.client.RemoteAgentExample"

# LLM 集成示例
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.client.LLMIntegrationExample"

高级功能示例

# 演示 content/link 模式、Information URL/Content 模式、Session 管理
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.advanced.AdvancedShopApplication"

协议概念示例

# 协议协商概念
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.negotiation.NegotiationConceptExample"

# AP2 支付协议概念
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.ap2.AP2ConceptExample"

Spring Boot 示例

cd java
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.springboot.HotelApplication"

本地开发示例(无 Spring)

# 终端 1:启动服务端
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.local.HotelServer"

# 终端 2:运行客户端
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.local.HotelClient"

LLM 智能客户端

export OPENAI_API_KEY=your-api-key
mvn exec:java -pl anp-examples -Dexec.mainClass="com.agentconnect.example.online.SmartAgentClient"

注解说明

@AnpAgent

标记一个类为 ANP Agent:

属性 说明 必填
name Agent 名称
description Agent 描述
did DID 标识符
prefix URL 前缀

@Interface

标记一个方法为可调用接口:

属性 说明 必填
name 方法名
description 方法描述

方法签名:

public Map<String, Object> methodName(Map<String, Object> params, Context ctx)

也支持使用 @Param 注解的直接参数方式:

public int add(@Param("a") int a, @Param("b") int b)

@Param

标记方法参数:

属性 说明 必填
value 参数名
description 参数描述
required 是否必填(默认 true)
defaultValue 默认值

依赖版本

依赖 版本
Java 11+
Spring Boot 2.7.18
Jackson 2.15.2
Bouncy Castle 1.70

License

MIT License