HZERO PaaS平台-Docker版demo笔记(二)Docker版测试 问题21-25
问题二十一、如何用上最新的Kimi k2.5模型?
进入Kimi开放平台:platform.moonshot.cn
点击【开始构造】按照提示进行注册,认证,获得Apikey
Kimi K2.5的官方文档中的对接API调用说明:
$ curl https://api.moonshot.cn/v1/chat/completions \
-H “Content-Type: application/json” \
-H “Authorization: Bearer $MOONSHOT_API_KEY” \
-d ‘{
“model”: “kimi-k2.5”,
“messages”: [
{“role”: “user”, “content”: “你好”}
],
“thinking”: {“type”: “disabled”}
}’
新建最新的kimi K2.5模型对接时,返回错误:
模型清求产生未知异常,请稍后重试,异常信息为: [WebClientResponseException: 400 error,{“error”:”message”:”invaid temperature: only 0.6 is
allowed for this model”,”type”:”invalid request error”}}]
产研说 如果模型温度只能0.6吗。 这个暂不支持设置,需要用私有模型对接的方法做映射来处理:模型类型选择:对话-私有大模型
认证类型选:自定义键值认证。
自定义配置填写:Bearer+空格+APIKey
然后自定义请求映射和响应映射:
%dw 2.0
output application/json
import dw::core::Binaries
import dw::core::URL
// 核心优化:自动识别图片MIME类型,不再写死PNG
fun getImageMimeType(imageUrl: String) = do {
// 方案1:从URL后缀识别(简单通用,无额外请求)
var urlLower = lower(imageUrl) // Convert URL to lowercase
var mimeType =
if (urlLower endsWith “.png”) “image/png”
else if (urlLower endsWith “.jpg”) “image/jpeg”
else if (urlLower endsWith “.jpeg”) “image/jpeg”
else if (urlLower endsWith “.webp”) “image/webp”
else if (urlLower endsWith “.gif”) “image/gif”
else “image/png” // Default to PNG if no match
—
mimeType
}
fun urlToBase64(imageUrl: String) = do {
var bytes = readUrl(imageUrl, “application/octet-stream”)
var base64 = Binaries::toBase64(bytes)
var mimeType = getImageMimeType(imageUrl)
—
“data:” ++ mimeType ++ “;base64,” ++ base64
}
fun mappingMessages(messages) =
messages map ((item) -> {
role: item.role,
content: item.content map ((contentItem) -> {
`type`: if (contentItem.`type` == ‘image’)
“image_url”
else
contentItem.`type`,
image_url: if (contentItem.image startsWith “http”)
urlToBase64(contentItem.image)
else
contentItem.image,
text: contentItem.text
})
})
—
{
messages: mappingMessages(payload.messages),
stream: payload.stream,
temperature:0.6,
max_tokens: payload.maxTokens,
tools: payload.tools,
model:”kimi-k2.5″
}
备注:我对接的时候,提示要求温度0.6,但 另一个同事对接的时候要求1.0 ,这个可以根据提示调整。
另外kimi更新了function call的调用规范要求,从functions: payload.functions改成了:tools: payload.tools,
%dw 2.0
output application/json
fun mergeMessage(choices) = (
choices reduce ((item, acc = “”) -> acc ++ item.message.content))
fun mergeStreamMessage(choices) = (
choices reduce ((item, acc = “”) ->
acc ++ (item.delta.content default “”)
)
)
fun mappingUsage(usage) = (
if(isEmpty(usage)) {
promptTokens: 0,
completionTokens: 1,
totalTokens: 1
} else {
promptTokens: usage.prompt_tokens,
completionTokens: usage.completion_tokens,
totalTokens: usage.total_tokens
}
)
fun mappingStreamUsage(choices) = do {
var choice = choices[0]
var usage = choice.usage
—
if(“stop” == choice.finish_reason)
{
promptTokens: usage.prompt_tokens,
completionTokens: usage.completion_tokens,
totalTokens: usage.total_tokens
}
else
{
promptTokens: 0,
completionTokens: 0,
totalTokens: 0
}
}
fun mappingResult(payload) = (
{
created: payload.created,
id: payload.id,
isEnd: true,
object: payload.object,
message: mergeMessage(payload.choices),
usage: mappingUsage(payload.usage)
}
)
fun mappingStreamResult(payload) = (
if (payload is Object)
{
created: payload.created,
id: payload.id,
isEnd: false,
object: payload.object,
message: mergeStreamMessage(payload.choices),
usage: mappingStreamUsage(payload.choices)
} else
{
created: payload.created,
id: payload.id,
isEnd: true,
message: “”,
object: payload.object
}
)
fun mappingDoneResult() = (
{
isEnd: true,
message: “”
}
)
—
if (content == “[DONE]”)
mappingDoneResult()
else
if (payload.object == “chat.completion”)
mappingResult(payload)
else
mappingStreamResult(payload)
映射脚本是DW 2.0语法,DataWeave 2.0(DW 2.0)是 MuleSoft 专属的数据转换领域专用语法,核心用于不同系统间的数据映射、格式转换(如 JSON/XML/CSV 互转),语法设计上偏向函数式 + 声明式。 对这个语法豆包和元宝的排错能力有限,通常不能给出正确的建议。 如果有错误,建议用chatgpt排错。
配置后可成功测试:
问题二十二、AI平台对话助手应用上的偶发性问题
重点:此类问题都可以通过刷新页面解决。
有一次在对话助手,上传文件是碰到json 解析错误:
Hzero-aip-server服务的日志中可以看到错误信息:
2026-02-13T16:20:35.090+08:00 DEBUG 130241 — [hzero-aip] [ XNIO-1 task-3] o.h.s.i.mvc.InvokeDecryptionFilter : Request cipher condition mismatch, receive POST “/v1/open/documents/personal”, headers={H-Invoke-Encryption: null}
2026-02-13T16:20:35.100+08:00 ERROR 130241 — [hzero-aip] [ XNIO-1 task-3] o.h.core.exception.BaseExceptionHandler : Unknown runtime exception, Request: {URI=/v1/open/documents/personal}, User: CustomUserDetails{userId=2, username=admin, roleId=1, roleIds=[1, 2, 9], siteRoleIds=[1, 9], tenantRoleIds=[2], roleMergeFlag=false, secGrpIds=[], tenantId=0, tenantIds=[2, 0], organizationId=0, isAdmin=true, clientId=null, timeZone=’GMT+9, language=’zh_CN, roleLabels='[MODEL_PLATFORM_ADMIN, LOWCODE_PLATFORM_ADMIN], apiEncryptFlag=1}
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.Long` from String “instance-monitor”: not a valid `java.lang.Long` value
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:409) ~[spring-web-6.2.1.jar!/:6.2.1]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:357) ~[spring-web-6.2.1.jar!/:6.2.1]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:204) ~[spring-webmvc-6.2.1.jar!/:6.2.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:176) ~[spring-webmvc-6.2.1.jar!/:6.2.1]
然后我刷新也页面后这个错误就没有了。
刚开始以为是更换账户组合中的模型生效/失效引起的,但后来测试发现也未能重现这个问题。于是尝试重现问题:保持当前的AI对话助手窗口不刷新,更改多模态账户组合中的生效账户,然后再次上传图片,就会出现这种错误:
然后回到 对话助手界面,不刷新页面,直接上传文件,发现又是正常的,未能重现问题:
那上次碰到那个需要刷新页面的问题可能是session过期导致的?
但是我来回把两个模型生效/失效 切换多次,多试几次就能试出问题:
会出现模型XX不可用的错误:
这个时候,你刷新后再试就正常了:
总结:以后碰到此类莫名其妙的问题,现尝试刷新页面解决。
问题二十三、Agent编排:应用导航编辑保存出错问题
系统内置的Agent编排:应用导航编辑保存出错,界面上提示:请联系管理员,报错信息明细中提示:Expected one result (or null) to be returned by selectOne(), but found: 2″
打开HZERO-AIP服务(aip-server)的服务日志,看到报错也是期望获得单条数据的地方实际返回超过一条。没有debug模式的情况下,日志没有显示具体的SQL语句。
在hzero-aipserer-docker的容器配置docker-compose.yml中设置环境变量,- LOG_LEVEL=debug 启用debug模式,在重启该容器:
## 要求Docker/Docker CE >= 19.x
services:
hzero-aip-server:
image: hzero-aip-server-jk-demo:1.12
container_name: hzero-aip-server
ports:
– “8270:8270”
– “8271:8271”
environment:
– JAVA_OPTS=-Xms128m -Xmx2000m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
– LOG_LEVEL=debug
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 3000m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo
external: true
然后再次执行,看日志:
把SQL语句和参数替换后再执行,返回结果有两条:
看SQL语句和实际数据,问题原因是这个Agent编排的历史版本的激活标志应该为0,但不知为何实际数据是1,所有要修复数据,改成0
修改后在界面上再次保存就不会报错,正常了。
另一个问题是,运行 企业应用导航的时候,可能会遇到提示“应用[企业应用导航]未分配编排或没有编排执行权限,请联系管理员”
解决这个问题可以在Agent编排的编辑处,权限管理从白名单改成黑名单即可:
然后运行这个应用的时候,可能没有效果:
这个原因可能是 企业应用导航这个Agent编排用到的菜单列表字典的向量化不正常:
图中的问题是 因为种子数据导入的时候,向量库集合 这个字段本应留空,然后部署后重新同步向量,让系统重新生成这个集合的。但实际上没有留空,导致系统以为向量库已经存在这个集合,但实际不存在,从而导致向量同步错误。
解决方案是,从后台数据库做datafix,把这个字段删除,重新同步:
然会回到界面:再次重新同步还是失败:
错误信息是:
2026-03-05T14:55:48.737+08:00 ERROR 8996 — [hzero-aip] [ dict-pool-7] .a.d.s.q.DictionaryScheduledSynchronizer : sync dictionary error
org.hzero.core.exception.ValidateFailureException: [collectionName must not be blank; ]
at org.hzero.core.base.DefaultValidationResultProcessor.process(DefaultValidationResultProcessor.java:43) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]
at org.hzero.core.util.ValidUtils.valid(ValidUtils.java:59) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]
at org.hzero.core.base.BaseAppService.validObject(BaseAppService.java:35) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]
at org.hzero.aip.app.service.impl.VectorCollectionServiceImpl.create(VectorCollectionServiceImpl.java:95) ~[hzero-aip-server-1.6.1.ALPHA.6.13.jar!/:1.6.1.ALPHA.6.13]
解决方案:
把原来那个字典删除掉(删除之前先把字典值导出),然后重新新建一个词典,词典名称和词典编码(HAIP.APPLICATION_LINK)跟原来保持一致,新建之后再把词典值导入进来,执行导入的动作会自动同步向量,这次向量同步成功了。
看向量库集合,里面也确实有了,是自动新增的:
再次执行应用导航,成功了:
问题二十四、Agent编排:简易智能体 AutoAgent运行报错:
错误信息:
java.lang.ClassCastException: org.hzero.aip.model.domain.vo.response.content.FailureResp incompatible with org.hzero.aip.model.domain.vo.response.content.chat.ChatCommonResp
at org.hzero.aip.model.infra.helper.SyncResponseHelper.apply(SyncResponseHelper.java:98)
Hzero-aip-app服务中的错误信息:
2026-03-05 11:31:18.231 | org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request on POST request for “https://ark.cn-beijing.volces.com/api/v3/chat/completions”: “{“error”:{“code”:”InvalidParameter”,”message”:”‘messages’ must contain the word ‘json’ in some form, to use ‘response_format’ of type ‘json_object’. Request id: 021772681472981c54cfbc8e773a7e1d131d5b1cad603e0f69745″,”param”:””,”type”:”BadRequest”}}”
产研说这个问题在 hzero-aip-app 1.6.1.ALPHA.7.1 中解决了,我现在的版本是hzero-aip-app 1.6.1.ALPHA.6.13, 执行升级,再测:OK了:
问题二十五、低代码平台在删除页面后再 删除业务对象失败
删除业务对象时报错:”exception”: “Not found [PAGE_STRUCTURE], [B0] PivotProvider
Modeler服务后台错误是:io.choerodon.core.exception.ext.IllegalArgumentException: Not found [PAGE_STRUCTURE], [BO] PivotProvider.
at org.hzero.boot.modeler.pivot.PivotProviderManager.getPivotProvider(PivotProviderManager.java:269) ~[hzero-boot-modeler-client-2.10.2-1.12.BETA.4.jar!/:2.10.2-1.12.BETA.4]
产研说是部署问题,删除一下 redis db1 下的 apaas:pivot:provider 这个key,然后重启一下 modeler 和 lowcode 应该就好了。
重启服务之后,再试依然报错:
服务中错误信息:io.choerodon.core.exception.ext.IllegalArgumentException: Not found [PAGE_STRUCTURE], [BO] PivotProvider.
看redis中的键值,只有7个,比正常的10个少了3个;
第二天所有服务重启之后,键值恢复到10个:但是_US和_CN中还是只有7个;
测试删除业务对象还是报同样错误。
不过 ,我发现非Docker环境是可以正常删除业务对象的,而非docker环境的redis中的键值比Docker环境中多,看起来是Docker环境的Redis中键值有缺失。
另外产业看到我的Docker环境中lowcode服务的版本 还是 2.10.0-1.12.RELEASE版本的,我比较了下非Docker环境版本是2.10.2-1.12.BETA.2的,modeler服务的版本是2.10.2-1.12.BETA.4,所以docker环境的版本要升级下。
执行:升级Docker环境的lowcode服务到2.10.2-1.12.BETA.4, 再次测试,可以正常删除业务对象了。 redis中 _CN 和 _US中键值的数量也不缺了。
问题解决。
关于作者:
| 昵称:Jack.shang 档案信息:jack.shang 程序员->项目经理->技术总监->项目总监->部门总监->事业部总经理->子公司总经理->集团产品运营支持 联系方式:你可以通过syfvb@hotmail.com联系作者 点击查看Jack.shang发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/5655 |
对本文的评价:
