refactor(ipuaro): simplify LLM integration with pure XML tool format

Refactor OllamaClient to use pure XML format for tool calls as
designed in CONCEPT.md. Removes dual system (Ollama native tools +
XML parser) in favor of single source of truth (ResponseParser).

Changes:
- Remove tools parameter from ILLMClient.chat() interface
- Remove convertTools(), convertParameters(), extractToolCalls()
- Add XML format instructions to system prompt with examples
- Add CDATA support in ResponseParser for multiline content
- Add tool name validation with helpful error messages
- Move ToolDef/ToolParameter to shared/types/tool-definitions.ts

Benefits:
- Simplified architecture (single source of truth)
- CONCEPT.md compliance (pure XML as designed)
- Better validation (early detection of invalid tools)
- Reduced complexity (fewer format conversions)

Tests: 1444 passed (+4 new tests)
Coverage: 97.83% lines, 91.98% branches, 99.16% functions
This commit is contained in:
imfozilbek
2025-12-01 21:03:55 +05:00
parent 902d1db831
commit 0433ef102c
13 changed files with 290 additions and 212 deletions

View File

@@ -1,26 +1,6 @@
import type { ChatMessage } from "../value-objects/ChatMessage.js"
import type { ToolCall } from "../value-objects/ToolCall.js"
/**
* Tool parameter definition for LLM.
*/
export interface ToolParameter {
name: string
type: "string" | "number" | "boolean" | "array" | "object"
description: string
required: boolean
enum?: string[]
}
/**
* Tool definition for LLM function calling.
*/
export interface ToolDef {
name: string
description: string
parameters: ToolParameter[]
}
/**
* Response from LLM.
*/
@@ -42,12 +22,16 @@ export interface LLMResponse {
/**
* LLM client service interface (port).
* Abstracts the LLM provider.
*
* Tool definitions should be included in the system prompt as XML format,
* not passed as a separate parameter.
*/
export interface ILLMClient {
/**
* Send messages to LLM and get response.
* Tool calls are extracted from the response content using XML parsing.
*/
chat(messages: ChatMessage[], tools?: ToolDef[]): Promise<LLMResponse>
chat(messages: ChatMessage[]): Promise<LLMResponse>
/**
* Count tokens in text.