Files
Hermes-ui/packages/server/src/services/hermes/run-chat/response-utils.ts
T

57 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-05-15 10:08:52 +08:00
/**
* Response utility functions for processing upstream API responses.
*/
export function responseFunctionCallToToolCall(item: any): any {
const callId = item.call_id || item.id || ''
const name = item.name || item.function?.name || ''
let args = item.arguments ?? item.function?.arguments ?? '{}'
if (typeof args !== 'string') {
args = JSON.stringify(args ?? {})
}
return {
id: callId,
type: 'function',
function: {
name,
arguments: args || '{}',
},
}
}
export function summarizeToolArguments(args: string): string | undefined {
if (!args) return undefined
try {
const parsed = JSON.parse(args)
if (!parsed || typeof parsed !== 'object') return args.slice(0, 120)
const preferredKeys = ['cmd', 'command', 'code', 'query', 'path', 'url', 'prompt']
for (const key of preferredKeys) {
const value = parsed[key]
if (typeof value === 'string' && value.trim()) {
return value.replace(/\s+/g, ' ').slice(0, 160)
}
}
const first = Object.entries(parsed).find(([, value]) => typeof value === 'string' && value.trim())
if (first) return String(first[1]).replace(/\s+/g, ' ').slice(0, 160)
return JSON.stringify(parsed).slice(0, 160)
} catch {
return args.replace(/\s+/g, ' ').slice(0, 160)
}
}
export function extractResponseText(response: any): string {
const output = Array.isArray(response?.output) ? response.output : []
const parts: string[] = []
for (const item of output) {
if (item.type !== 'message') continue
const content = Array.isArray(item.content) ? item.content : []
for (const part of content) {
if (part.type === 'output_text' || part.type === 'text') {
parts.push(part.text || '')
}
}
}
if (parts.length > 0) return parts.join('')
return typeof response?.output_text === 'string' ? response.output_text : ''
}