提交 0e712744 authored 作者: 张孟夏's avatar 张孟夏

修改1.1不兼容的用例,调整grpc客户端代码

上级 d48f651e
...@@ -13,7 +13,7 @@ ${path} /api/system/config/client ...@@ -13,7 +13,7 @@ ${path} /api/system/config/client
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 200 Should Be Equal As Strings ${content["code"]} 200
Should Be Equal As Strings ${content["message"]} 成功 Should Be Equal As Strings ${content["message"]} 成功
Should Be Equal As Strings ${content["data"]} {\"grpc_host\":\"192.168.110.211:9090\",\"grpc_use_ssl\":false} Should Contain ${content["data"]} \"grpc_host\":\"192.168.110.211:9090\",\"grpc_use_ssl\":false
反例-不传入token 反例-不传入token
[Tags] E [Tags] E
...@@ -22,7 +22,7 @@ ${path} /api/system/config/client ...@@ -22,7 +22,7 @@ ${path} /api/system/config/client
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 200 Should Be Equal As Strings ${content["code"]} 200
Should Be Equal As Strings ${content["message"]} 成功 Should Be Equal As Strings ${content["message"]} 成功
Should Be Equal As Strings ${content["data"]} {\"grpc_host\":\"192.168.110.211:9090\",\"grpc_use_ssl\":false} Should Contain ${content["data"]} \"grpc_host\":\"192.168.110.211:9090\",\"grpc_use_ssl\":false
反例-传入错误的token 反例-传入错误的token
[Tags] E [Tags] E
...@@ -31,4 +31,4 @@ ${path} /api/system/config/client ...@@ -31,4 +31,4 @@ ${path} /api/system/config/client
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 200 Should Be Equal As Strings ${content["code"]} 200
Should Be Equal As Strings ${content["message"]} 成功 Should Be Equal As Strings ${content["message"]} 成功
Should Be Equal As Strings ${content["data"]} {\"grpc_host\":\"192.168.110.211:9090\",\"grpc_use_ssl\":false} Should Contain ${content["data"]} \"grpc_host\":\"192.168.110.211:9090\",\"grpc_use_ssl\":false
...@@ -5,20 +5,26 @@ Library get_expId.py ...@@ -5,20 +5,26 @@ Library get_expId.py
*** Variables *** *** Variables ***
${path} /api/chat/read ${path} /api/chat/read
${clientId} a68ad587830d41aebf418a919006353e
*** Test Cases *** *** Test Cases ***
正例-正常读取消息 正例-正常读取消息
[Tags] F [Tags] F
Sleep 10
${resp} Get ExpId http://bitagent.sit.ninetechone.com/${path} ${sessionId} ${ex_streamId} ${token} ${resp} Get ExpId http://bitagent.sit.ninetechone.com/${path} ${sessionId} ${ex_streamId} ${token}
log ${resp} log ${resp}
Should Contain ${resp}[0] EXP_ Should Contain ${resp["sessionId"]} P_EXP
Set Global Variable ${expId} ${resp}[0] Set Global Variable ${expId} ${resp["sessionId"]}
${content} GET请求结果 /api/chat/retry {"sessionId":"${expId}","workerId":"${clientId}"} 200 ${token}
Set Global Variable ${streamId} ${content["data"]}
${resp1} Get ExpId http://bitagent.sit.ninetechone.com/${path} ${expId} ${streamId} ${token}
log ${resp1}
正例-正常读取对话消息 正例-正常读取对话消息
[Tags] F [Tags] F
${resp} Get Message http://bitagent.sit.ninetechone.com/${path} ${sessionId} ${text_streamId} ${token} ${resp} Get Message http://bitagent.sit.ninetechone.com/${path} ${sessionId} ${text_streamId} ${token}
log ${resp} log ${resp}
Should Contain ${resp}[0] 让我想想 Should Contain ${resp}[0] 你好
Should Contain ${resp}[-1] 关闭 Should Contain ${resp}[-1] 关闭
反例-传入错误的token 反例-传入错误的token
......
...@@ -9,7 +9,7 @@ ${path} /api/chat/interrupt ...@@ -9,7 +9,7 @@ ${path} /api/chat/interrupt
正例-正常中断消息 正例-正常中断消息
[Tags] F [Tags] F
create session URI ${URL} create session URI ${URL}
${content} GET请求结果 ${path} {"sessionId":"${sessionId}"} 200 ${token} ${content} GET请求结果 ${path} {"sessionId":"${sessionId}","streamId":"${ex_streamId}"} 200 ${token}
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 200 Should Be Equal As Strings ${content["code"]} 200
Should Be Equal As Strings ${content["message"]} 成功 Should Be Equal As Strings ${content["message"]} 成功
...@@ -17,7 +17,7 @@ ${path} /api/chat/interrupt ...@@ -17,7 +17,7 @@ ${path} /api/chat/interrupt
反例-传入错误的token 反例-传入错误的token
[Tags] E [Tags] E
create session URI ${URL} create session URI ${URL}
${content} GET请求结果 ${path} {"sessionId":"${sessionId}"} 401 testtoken ${content} GET请求结果 ${path} {"sessionId":"${sessionId}","streamId":"${ex_streamId}"} 401 testtoken
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 401 Should Be Equal As Strings ${content["code"]} 401
Should Be Equal As Strings ${content["message"]} 无效的access token Should Be Equal As Strings ${content["message"]} 无效的access token
...@@ -25,7 +25,7 @@ ${path} /api/chat/interrupt ...@@ -25,7 +25,7 @@ ${path} /api/chat/interrupt
反例-传入空白token 反例-传入空白token
[Tags] E [Tags] E
create session URI ${URL} create session URI ${URL}
${content} GET请求结果 ${path} {"sessionId":"${sessionId}"} 401 ${EMPTY} ${content} GET请求结果 ${path} {"sessionId":"${sessionId}","streamId":"${ex_streamId}"} 401 ${EMPTY}
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 401 Should Be Equal As Strings ${content["code"]} 401
Should Be Equal As Strings ${content["message"]} 没有找到认证信息 Should Be Equal As Strings ${content["message"]} 没有找到认证信息
...@@ -33,7 +33,15 @@ ${path} /api/chat/interrupt ...@@ -33,7 +33,15 @@ ${path} /api/chat/interrupt
反例-不传sessionId参数 反例-不传sessionId参数
[Tags] E [Tags] E
create session URI ${URL} create session URI ${URL}
${content} GET请求结果 ${path} {} 200 ${token} ${content} GET请求结果 ${path} {"streamId":"${ex_streamId}"} 200 ${token}
log ${content}
Should Be Equal As Strings ${content["code"]} 500
Should Be Equal As Strings ${content["message"]} Server busy, please try later
反例-不传streamId参数
[Tags] E
create session URI ${URL}
${content} GET请求结果 ${path} {"sessionId":"${sessionId}"} 200 ${token}
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 500 Should Be Equal As Strings ${content["code"]} 500
Should Be Equal As Strings ${content["message"]} Server busy, please try later Should Be Equal As Strings ${content["message"]} Server busy, please try later
...@@ -40,8 +40,9 @@ ${path} /api/ability/steps ...@@ -40,8 +40,9 @@ ${path} /api/ability/steps
反例-会话过期 反例-会话过期
[Tags] F [Tags] F
create session URI ${URL} Comment 当前版本会话保持持久化,不会过期,此用例废弃
${content} GET请求结果 ${path} {"exploreSessionId":1,"chatbotSessionId":10} 200 ${token} Comment create session URI ${URL}
log ${content} Comment ${content} GET请求结果 ${path} {"exploreSessionId":1,"chatbotSessionId":10} 200 ${token}
Should Be Equal As Strings ${content["code"]} BAE0001 Comment log ${content}
Should Be Equal As Strings ${content["message"]} 会话已过期,请开启新对话 Comment Should Be Equal As Strings ${content["code"]} BAE0001
Comment Should Be Equal As Strings ${content["message"]} 会话已过期,请开启新对话
...@@ -12,7 +12,7 @@ ${path} /api/ability ...@@ -12,7 +12,7 @@ ${path} /api/ability
${random_string} Generate Random String 12 [LOWER] ${random_string} Generate Random String 12 [LOWER]
log ${random_string} log ${random_string}
create session URI ${URL} create session URI ${URL}
${content} POST请求结果 ${path} {"exploreSessionId":"${expId}","filteredStepIndices":[0],"draft":{"name":"${random_string}","description":"自动化测试能力","startPageUrl":"https://www.baidu.com","parameters":[{"name":"search_query","description":"用户希望在百度上搜索的关键词。","example": "天气预报","type": "string"}],"stepIndices": [0]}} 200 ${token} ${content} POST请求结果 ${path} {"exploreSessionId":"${expId}","filteredStepIndices":[0],"draft":{"name":"${random_string}","description":"自动化测试","parameters":[],"startPageUrl":"https://www.baidu.com","stepIndices":[0]}} 200 ${token}
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} 200 Should Be Equal As Strings ${content["code"]} 200
Should Be Equal As Strings ${content["message"]} 成功 Should Be Equal As Strings ${content["message"]} 成功
...@@ -45,7 +45,7 @@ ${path} /api/ability ...@@ -45,7 +45,7 @@ ${path} /api/ability
反例-能力名已存在 反例-能力名已存在
[Tags] F [Tags] F
create session URI ${URL} create session URI ${URL}
${content} POST请求结果 ${path} {"exploreSessionId":"${expId}","filteredStepIndices":[0],"draft":{"name":"outhagent","description":"该能力用于访问百度主页,以查看其内容和功能。用户可以通过此能力快速打开百度主页,进行信息搜索和浏览。","startPageUrl":"https://www.baidu.com","parameters":[{"name":"search_query","description":"用户希望在百度上搜索的关键词。","example": "天气预报","type": "string"}],"stepIndices": [0]}} 200 ${token} ${content} POST请求结果 ${path} {"exploreSessionId":"${expId}","filteredStepIndices":[0],"draft":{"name":"outhagent","description":"自动化测试","parameters":[],"startPageUrl":"https://www.baidu.com","stepIndices":[0]}} 200 ${token}
log ${content} log ${content}
Should Be Equal As Strings ${content["code"]} BAE0008 Should Be Equal As Strings ${content["code"]} BAE0008
Should Be Equal As Strings ${content["message"]} 此能力名已存在 Should Be Equal As Strings ${content["message"]} 此能力名已存在
...@@ -62,6 +62,6 @@ def get_message(url,sessionId,streamId,token,timeout=180): ...@@ -62,6 +62,6 @@ def get_message(url,sessionId,streamId,token,timeout=180):
return oplist return oplist
# print(get_expId('http://bitagent.sit.ninetechone.com/api/chat/read','CB_2a7714d1e41e4d0891fc5c13a39a4063','CB_a556efbc8502461ba473d789da439c55','Bearer c1391926-e8ba-46c0-a0d1-c5e3c38503da')) # print(get_expId('http://bitagent.sit.ninetechone.com/api/chat/read','P_CB_f21b81ef55ab48f8b87530500ced227d','P_CB_976bebae52514b39a140e38f88cd2dee','Bearer d25c4717-087b-4472-aaaa-2a1939f22680'))
# print(get_expId('http://bitagent.sit.ninetechone.com/api/chat/read','CB_e48bea09fe1e4c8388883ff11384bef8','CB_0e7c9c99d6494d9f977b0c2fbb73e2e3','Bearer c1391926-e8ba-46c0-a0d1-c5e3c38503da')) # print(get_expId('http://bitagent.sit.ninetechone.com/api/chat/read','CB_e48bea09fe1e4c8388883ff11384bef8','CB_0e7c9c99d6494d9f977b0c2fbb73e2e3','Bearer c1391926-e8ba-46c0-a0d1-c5e3c38503da'))
# print(get_message('http://bitagent.sit.ninetechone.com/api/chat/read','CB_e268fb27e7d146009d18e0912c23be58','CB_bc6ed32cc3e0476d90c7b243c75cf2a9','Bearer c1391926-e8ba-46c0-a0d1-c5e3c38503da')) # print(get_message('http://bitagent.sit.ninetechone.com/api/chat/read','P_CB_f21b81ef55ab48f8b87530500ced227d','P_CB_976bebae52514b39a140e38f88cd2dee','Bearer d25c4717-087b-4472-aaaa-2a1939f22680'))
import json
import logging
from typing import Optional
from pydantic import BaseModel
from models import ResultModel
logger = logging.getLogger(__name__)
class RequestBodyModel(BaseModel):
path: str
data: str
headers: str
def parse_request_body(body: str) -> Optional[RequestBodyModel]:
if not body:
return None
parts = body.split("\n", maxsplit=2)
if len(parts) == 3:
return RequestBodyModel(
path=parts[0].strip("/"), headers=parts[1], data=parts[2]
)
else:
logger.error(f"指令格式错误:{body}")
return None
def format_response_body(consume_result: ResultModel):
responseBody = f"{consume_result.code}\n{consume_result.message}"
if consume_result.code == 200 and consume_result.data is not None:
try:
response_headers = json.dumps(
{},
default=lambda o: o.__dict__,
ensure_ascii=False,
)
response_data = json.dumps(
consume_result.data,
default=lambda o: o.__dict__,
ensure_ascii=False,
)
responseBody = f"{consume_result.code}\n{response_headers}\n{response_data}"
except Exception as e:
logger.exception(f"json encode error:{consume_result.data} {e}")
return responseBody
...@@ -5,8 +5,6 @@ from typing import Callable, List, Optional ...@@ -5,8 +5,6 @@ from typing import Callable, List, Optional
import grpc import grpc
import grpc.aio import grpc.aio
# from native.config import settings
# from native.utils.utils import singleton
from protos.BitAgentWorker_pb2_grpc import ConnectServiceStub from protos.BitAgentWorker_pb2_grpc import ConnectServiceStub
...@@ -15,13 +13,13 @@ logger = logging.getLogger(__name__) ...@@ -15,13 +13,13 @@ logger = logging.getLogger(__name__)
class GrpcClient: class GrpcClient:
GRPC_CHANNEL_OPTIONS = [ GRPC_CHANNEL_OPTIONS = [
("grpc.max_send_message_length", 1000), ("grpc.max_send_message_length", 10*1024*1024),
("grpc.max_receive_message_length", 1000), ("grpc.max_receive_message_length", 10*1024*1024),
# ("grpc.keep_alive_time", settings.GRPC_HEART_INTERVAL_SECONDS), # ("grpc.keep_alive_time", settings.GRPC_HEART_INTERVAL_SECONDS),
# ("grpc.keep_alive_timeout", settings.GRPC_HEART_INTERVAL_SECONDS), # ("grpc.keep_alive_timeout", settings.GRPC_HEART_INTERVAL_SECONDS),
# ("grpc.enable_retries", 1), # ("grpc.enable_retries", 1),
] ]
connect_timeout_seconds: int = 30 connect_timeout_seconds: int = 60
def __init__(self): def __init__(self):
self._address: str = "" self._address: str = ""
...@@ -62,7 +60,7 @@ class GrpcClient: ...@@ -62,7 +60,7 @@ class GrpcClient:
if address is None or address == "": if address is None or address == "":
raise ValueError("grpc address must be set") raise ValueError("grpc address must be set")
logger.debug( logger.info(
f"connect grpc to {address} use_ssl:{use_ssl} header:{str(self._header)}" f"connect grpc to {address} use_ssl:{use_ssl} header:{str(self._header)}"
) )
self._is_disconnected = False self._is_disconnected = False
...@@ -131,7 +129,7 @@ class GrpcClient: ...@@ -131,7 +129,7 @@ class GrpcClient:
# 创建通道 # 创建通道
if not self._channel: if not self._channel:
logger.debug("create channel") logger.info("create channel")
if self._use_ssl: if self._use_ssl:
credits: grpc.ChannelCredentials = ( credits: grpc.ChannelCredentials = (
grpc.ssl_channel_credentials() grpc.ssl_channel_credentials()
...@@ -145,7 +143,7 @@ class GrpcClient: ...@@ -145,7 +143,7 @@ class GrpcClient:
) )
# 等待连接 # 等待连接
logger.debug(f"wait channel ready to {self._address}") logger.info(f"wait channel ready to {self._address}")
await asyncio.wait_for( await asyncio.wait_for(
self._channel.channel_ready(), timeout=self.connect_timeout_seconds self._channel.channel_ready(), timeout=self.connect_timeout_seconds
) )
......
差异被折叠。
import json
from copy import deepcopy
from enum import Flag, auto
from typing import Any
from pydantic import BaseModel
class ActivityType(Flag):
BROWSER = auto() # 1
APP = auto() # 2
def truncate_base64_fields(data: Any, truncate_length: int = 10) -> Any:
if isinstance(data, dict):
new_data = {}
for key, value in data.items():
# 如果是base64图片字段,截断
if key in [
"screenshots",
"screenshotsBase64",
"screenshots_base64",
] and isinstance(value, list):
truncated_list = [
(item[:truncate_length] + "...")
if isinstance(item, str) and len(item) > truncate_length
else item
for item in value
]
new_data[key] = truncated_list
else:
new_data[key] = truncate_base64_fields(value, truncate_length)
return new_data
elif isinstance(data, list):
return [truncate_base64_fields(item, truncate_length) for item in data]
else:
return data
class ResultModel(BaseModel):
code: int
data: Any = None
message: str = ""
@staticmethod
def success(data: Any = None, message: str = "") -> "ResultModel":
return ResultModel(code=200, data=data, message=message)
@staticmethod
def error(
message: str,
code: int = 500,
data: Any = None,
) -> "ResultModel":
return ResultModel(code=code, message=message, data=data)
def log_str(self) -> str:
try:
raw_dict = self.dict()
safe_dict = deepcopy(raw_dict)
log = truncate_base64_fields(safe_dict)
return json.dumps(
log,
default=lambda o: o.__dict__,
ensure_ascii=False,
)
except Exception:
return json.dumps(
self,
default=lambda o: o.__dict__,
ensure_ascii=False,
)
...@@ -3,8 +3,7 @@ ...@@ -3,8 +3,7 @@
import grpc import grpc
import grpc_manager.protos.BitAgentWorker_pb2 as BitAgentWorker__pb2
import protos.BitAgentWorker_pb2 as BitAgentWorker__pb2
GRPC_GENERATED_VERSION = "1.69.0" GRPC_GENERATED_VERSION = "1.69.0"
GRPC_VERSION = grpc.__version__ GRPC_VERSION = grpc.__version__
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论