更新时间:2026-04-15 GMT+08:00
分享

SDK应用框架

框架概述

SDK应用框架基于Starlette Web框架实现,采用装饰器模式将用户函数封装为HTTP端点。这种设计使得开发者无需关心底层网络通信,只需专注于业务逻辑的实现。

核心入口类: HuaweiAgentRunApp

HuaweiAgentRunApp是SDK的核心类,继承自Starlette框架,提供AI代理部署所需的所有Web服务功能。

文件位置:src/hw_agentrun_wrapper/runtime/app.py

基本用法

from hw_agentrun_wrapper import HuaweiAgentRunApp
app = HuaweiAgentRunApp()
@app.entrypoint
def my_agent(payload, context):
    return {"response": "Hello, World!"}
app.run(port=8080)

装饰器详解

@app.entrypoint - 主入口装饰器

用于注册主处理函数,处理所有到达/invocations端点的请求。

@app.entrypoint
def handle_request(payload, context):
    """
    处理Agent调用请求

    Args:
        payload: 请求载荷,包含用户输入
        context: 请求上下文,包含用户ID、会话ID等信息

    Returns:
        响应数据,可以是普通对象、生成器或异步生成器
    """
    prompt = payload.get("prompt")
    # 处理逻辑
    return {"response": f"处理: {prompt}"}

支持的返回类型

  • 普通对象:自动序列化为JSON响应
  • 同步生成器:支持流式响应(SSE)
  • 异步生成器:支持异步流式响应

@app.ping - 健康检查装饰器

用于注册自定义的健康检查处理器。

@app.ping
def custom_ping():
    """返回自定义的ping状态"""
    return "Healthy"  # 或返回 PingStatus.HEALTHY

PingStatus枚举值

  • HEALTHY:健康状态
  • HEALTHY_BUSY:忙碌状态
  • UNHEALTHY:不健康状态

@app.websocket - WebSocket装饰器

用于注册WebSocket处理函数,支持双向实时通信。

@app.websocket
async def handle_websocket(websocket, context):
    """处理WebSocket连接"""
    await websocket.accept()
    while True:
        try:
            data = await websocket.receive_text()
            # 处理消息
            await websocket.send_text(f"Echo: {data}")
        except Exception:
            break

@app.async_task - 异步任务装饰器

用于注册异步任务,SDK会自动追踪任务健康状态。

@app.async_task
async def background_task():
    """后台异步任务"""
    # 任务执行期间,ping状态会自动设置为HEALTHY_BUSY
    # 任务完成后,自动恢复为HEALTHY
    await asyncio.sleep(10)

请求上下文

SDK提供两种上下文对象用于获取请求信息:

AgentArtsRuntimeContext

基于contextvars的线程安全运行时上下文,用于在请求处理过程中存储和获取上下文信息。

from hw_agentrun_wrapper.runtime.context import AgentArtsRuntimeContext
# 设置上下文
AgentArtsRuntimeContext.set_user_id("user123")
AgentArtsRuntimeContext.set_session_id("session456")
AgentArtsRuntimeContext.set_workload_access_token("token789")
# 获取上下文
user_id = AgentArtsRuntimeContext.get_user_id()
session_id = AgentArtsRuntimeContext.get_session_id()
token = AgentArtsRuntimeContext.get_workload_access_token()

RequestContext

请求级别的上下文对象,包含请求的详细信息。

@app.entrypoint
def handle_request(payload, context: RequestContext):
    """
    context包含以下属性:
    - user_id: 用户ID
    - session_id: 会话ID
    - request_id: 请求ID
    - workload_access_token: 工作负载访问令牌
    """
    print(f"User: {context.user_id}")
    print(f"Session: {context.session_id}")
    return {"status": "ok"}

框架请求处理流程

HTTP请求
    │
    ▼
Starlette Router
    │
    ├─ POST /invocations ──▶ _handle_invocation()
    │                              │
    │                              ├─ 解析JSON payload
    │                              ├─ 构建RequestContext
    │                              ├─ 调用用户handler
    │                              ├─ 处理响应类型:
    │                              │   ├─ StreamingResponse (SSE)
    │                              │   ├─ JSONResponse
    │                              │   └─ 普通Response
    │                              └─ 返回响应
    │
    ├─ GET /ping ──▶ _handle_ping()
    │                     │
    │                     └─ 返回PingStatus
    │
    └─ WebSocket /ws ──▶ _handle_websocket()
                              │
                              └─ 传递给websocket handler

相关文档