mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-10-26 02:04:37 +08:00
chore(ai): finalize global statistics integration
This commit is contained in:
1 parent
207c41afaa
commit
05d9b34f30
5 files changed
+106
-40
No files matched your search
@@ -5,12 +5,7 @@ import type {
|
||||
SessionRuntimeAdapter,
|
||||
} from '@openchatlab/node-runtime'
|
||||
import { countTokens, preprocessCrossChatMessages } from '@openchatlab/node-runtime'
|
||||
import {
|
||||
CROSS_CHAT_AGENT_TOOL_REGISTRY,
|
||||
executeToolForAgent,
|
||||
toAgentToolParameters,
|
||||
type CrossChatToolExecutionContext,
|
||||
} from '@openchatlab/tools'
|
||||
import { createCrossChatAgentToolAdapters, type CrossChatToolExecutionContext } from '@openchatlab/tools'
|
||||
|
||||
export function createCliCrossChatTools(options: {
|
||||
analysisService: CrossChatAnalysisService
|
||||
@@ -33,17 +28,5 @@ export function createCliCrossChatTools(options: {
|
||||
),
|
||||
}
|
||||
|
||||
return CROSS_CHAT_AGENT_TOOL_REGISTRY.map((tool) => ({
|
||||
name: tool.name,
|
||||
label: tool.name,
|
||||
description: tool.description,
|
||||
parameters: toAgentToolParameters(tool.inputSchema) as any,
|
||||
executionMode: tool.executionMode,
|
||||
execute: async (_toolCallId: string, params: unknown, signal, onUpdate) =>
|
||||
executeToolForAgent(tool, params, {
|
||||
...context,
|
||||
abortSignal: signal,
|
||||
reportProgress: (progress) => onUpdate?.({ content: [], details: { progress } }),
|
||||
}),
|
||||
}))
|
||||
return createCrossChatAgentToolAdapters(context) as AgentTool<any, any>[]
|
||||
}
|
||||
@@ -5,12 +5,7 @@ import type {
|
||||
SessionRuntimeAdapter,
|
||||
} from '@openchatlab/node-runtime'
|
||||
import { countTokens, preprocessCrossChatMessages } from '@openchatlab/node-runtime'
|
||||
import {
|
||||
CROSS_CHAT_AGENT_TOOL_REGISTRY,
|
||||
executeToolForAgent,
|
||||
toAgentToolParameters,
|
||||
type CrossChatToolExecutionContext,
|
||||
} from '@openchatlab/tools'
|
||||
import { createCrossChatAgentToolAdapters, type CrossChatToolExecutionContext } from '@openchatlab/tools'
|
||||
|
||||
export function createElectronCrossChatTools(options: {
|
||||
analysisService: CrossChatAnalysisService
|
||||
@@ -33,17 +28,5 @@ export function createElectronCrossChatTools(options: {
|
||||
),
|
||||
}
|
||||
|
||||
return CROSS_CHAT_AGENT_TOOL_REGISTRY.map((tool) => ({
|
||||
name: tool.name,
|
||||
label: tool.name,
|
||||
description: tool.description,
|
||||
parameters: toAgentToolParameters(tool.inputSchema) as any,
|
||||
executionMode: tool.executionMode,
|
||||
execute: async (_toolCallId: string, params: unknown, signal, onUpdate) =>
|
||||
executeToolForAgent(tool, params, {
|
||||
...context,
|
||||
abortSignal: signal,
|
||||
reportProgress: (progress) => onUpdate?.({ content: [], details: { progress } }),
|
||||
}),
|
||||
}))
|
||||
return createCrossChatAgentToolAdapters(context) as AgentTool<any, any>[]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import test from 'node:test'
|
||||
import type {
|
||||
CrossChatGlobalActivitySummaryRequest,
|
||||
CrossChatGlobalActivitySummaryResult,
|
||||
} from '@openchatlab/shared-types'
|
||||
import { createCrossChatAgentToolAdapters } from './agent-adapter'
|
||||
import type { CrossChatAnalysisToolService } from './types'
|
||||
|
||||
function globalActivitySummary(): CrossChatGlobalActivitySummaryResult {
|
||||
return {
|
||||
mode: 'year',
|
||||
dataState: 'fresh',
|
||||
summary: {
|
||||
range: { mode: 'year', year: 2026, startTs: 1, endTs: 2 },
|
||||
availableDataYears: [2026],
|
||||
latestDataYear: 2026,
|
||||
metrics: {
|
||||
sentMessageCount: 100,
|
||||
activeDayCount: 10,
|
||||
directContactCount: 5,
|
||||
averageMessagesPerDay: 10,
|
||||
averageDirectContactsPerDay: 1,
|
||||
},
|
||||
monthlyActivity: [],
|
||||
monthlyDirectContacts: [],
|
||||
dailyActivity: [],
|
||||
messageTypes: [],
|
||||
textLength: null,
|
||||
coverage: {
|
||||
totalSessions: 2,
|
||||
analyzedSessions: 2,
|
||||
missingOwnerSessions: 0,
|
||||
unresolvedOwnerSessions: 0,
|
||||
failedSessions: 0,
|
||||
},
|
||||
cache: { status: 'fresh', computedAt: 3 },
|
||||
task: {
|
||||
id: null,
|
||||
status: 'idle',
|
||||
startedAt: null,
|
||||
finishedAt: null,
|
||||
processedSessions: 0,
|
||||
totalSessions: 0,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
test('the shared Desktop and CLI Web adapter exposes and executes all ten cross-chat tools', async () => {
|
||||
const requests: CrossChatGlobalActivitySummaryRequest[] = []
|
||||
const analysisService = {
|
||||
getGlobalActivitySummary(request: CrossChatGlobalActivitySummaryRequest) {
|
||||
requests.push(request)
|
||||
return globalActivitySummary()
|
||||
},
|
||||
} as unknown as CrossChatAnalysisToolService
|
||||
const tools = createCrossChatAgentToolAdapters({
|
||||
locale: 'zh-CN',
|
||||
analysisService,
|
||||
maxToolResultTokens: 16_000,
|
||||
preprocessMessagesBySession: async (_sessionId, messages) => messages,
|
||||
})
|
||||
|
||||
assert.equal(tools.length, 10)
|
||||
const summaryTool = tools.find((tool) => tool.name === 'get_global_activity_summary')
|
||||
assert.ok(summaryTool)
|
||||
assert.deepEqual(Object.keys(summaryTool.parameters.properties), ['mode', 'year'])
|
||||
|
||||
const result = await summaryTool.execute('summary-call', { mode: 'year', year: 2026 }, new AbortController().signal)
|
||||
|
||||
assert.deepEqual(requests, [{ mode: 'year', year: 2026 }])
|
||||
assert.equal((result.details as CrossChatGlobalActivitySummaryResult).dataState, 'fresh')
|
||||
assert.equal(JSON.parse(result.content[0]?.text ?? '{}').metrics.sentMessageCount, 100)
|
||||
})
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { JsonSchema, ToolDefinition, ToolResult } from './types'
|
||||
import { CROSS_CHAT_AGENT_TOOL_REGISTRY } from './registry'
|
||||
import type { CrossChatToolExecutionContext, JsonSchema, ToolDefinition, ToolProgress, ToolResult } from './types'
|
||||
|
||||
interface AgentToolParameters {
|
||||
type: 'object'
|
||||
@@ -64,3 +65,27 @@ export async function executeToolForAgent<TContext>(
|
||||
return { content: [{ type: 'text', text: `Error: ${message}` }], details: null, isError: true }
|
||||
}
|
||||
}
|
||||
|
||||
/** Desktop 与 CLI Web 共用同一套跨会话工具装配,避免平台 wrapper 漏注册或产生 schema 漂移。 */
|
||||
export function createCrossChatAgentToolAdapters(
|
||||
context: Omit<CrossChatToolExecutionContext, 'abortSignal' | 'reportProgress'>
|
||||
) {
|
||||
return CROSS_CHAT_AGENT_TOOL_REGISTRY.map((tool) => ({
|
||||
name: tool.name,
|
||||
label: tool.name,
|
||||
description: tool.description,
|
||||
parameters: toAgentToolParameters(tool.inputSchema),
|
||||
executionMode: tool.executionMode,
|
||||
execute: async (
|
||||
_toolCallId: string,
|
||||
params: unknown,
|
||||
signal: AbortSignal,
|
||||
onUpdate?: (update: { content: []; details: { progress: ToolProgress } }) => void
|
||||
) =>
|
||||
executeToolForAgent(tool, params, {
|
||||
...context,
|
||||
abortSignal: signal,
|
||||
reportProgress: (progress) => onUpdate?.({ content: [], details: { progress } }),
|
||||
}),
|
||||
}))
|
||||
}
|
||||
@@ -19,7 +19,7 @@ export {
|
||||
export { CoreDataProvider } from './providers/core-data-provider'
|
||||
|
||||
// === Agent Adapter ===
|
||||
export { executeToolForAgent, toAgentToolParameters } from './agent-adapter'
|
||||
export { createCrossChatAgentToolAdapters, executeToolForAgent, toAgentToolParameters } from './agent-adapter'
|
||||
export { getLocalizedToolMetadata } from './tool-metadata'
|
||||
|
||||
// === Tool Definitions ===
|
||||
|
||||
Reference in new issue
Block a user