activo 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +22 -49
- package/dist/core/agent.js.map +1 -1
- package/dist/core/llm/ollama.d.ts.map +1 -1
- package/dist/core/llm/ollama.js +30 -16
- package/dist/core/llm/ollama.js.map +1 -1
- package/package.json +1 -1
- package/src/core/agent.ts +20 -47
- package/src/core/llm/ollama.ts +33 -17
package/dist/core/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAsC,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAExF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAsC,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAExF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC,CAAC;CACJ;AA+BD,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CA2EtB;AAED,wBAAuB,oBAAoB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAAC,UAAU,CAAC,CAkG5B"}
|
package/dist/core/agent.js
CHANGED
|
@@ -1,51 +1,16 @@
|
|
|
1
1
|
import { getAllTools, executeTool } from "./tools/index.js";
|
|
2
|
-
const BASE_SYSTEM_PROMPT = `You are ACTIVO
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
\`\`\`
|
|
15
|
-
|
|
16
|
-
CORRECT:
|
|
17
|
-
\`\`\`
|
|
18
|
-
tool_call(...)
|
|
19
|
-
\`\`\`
|
|
20
|
-
|
|
21
|
-
## AFTER TOOL RETURNS
|
|
22
|
-
|
|
23
|
-
Only AFTER you receive the actual tool result, you may write a response summarizing what the tool returned.
|
|
24
|
-
|
|
25
|
-
## HALLUCINATION = FAILURE
|
|
26
|
-
|
|
27
|
-
If you write ANY of these WITHOUT a tool result, you have FAILED:
|
|
28
|
-
- File names (e.g., "UserService.java")
|
|
29
|
-
- Numbers (e.g., "복잡도: 15", "3개 파일")
|
|
30
|
-
- Paths (e.g., "/path/to/file.md")
|
|
31
|
-
- Status messages (e.g., "변환 완료!", "성공")
|
|
32
|
-
|
|
33
|
-
## Tools
|
|
34
|
-
|
|
35
|
-
- analyze_all: 코드 분석
|
|
36
|
-
- import_pdf_standards: PDF→마크다운 (pdfPath 필수)
|
|
37
|
-
- import_hwp_standards: HWP→마크다운 (hwpPath 필수)
|
|
38
|
-
- read_file, write_file, list_directory, grep_search, glob_search: 파일
|
|
39
|
-
|
|
40
|
-
## Example
|
|
41
|
-
|
|
42
|
-
User: "HWP 파일을 마크다운으로 변환해줘"
|
|
43
|
-
|
|
44
|
-
YOUR RESPONSE (no other text):
|
|
45
|
-
→ Call import_hwp_standards with hwpPath
|
|
46
|
-
|
|
47
|
-
AFTER tool returns result:
|
|
48
|
-
→ Now you can summarize the actual result`;
|
|
2
|
+
const BASE_SYSTEM_PROMPT = `You are ACTIVO. Call tools immediately. No explanation before tool calls.
|
|
3
|
+
|
|
4
|
+
Tools:
|
|
5
|
+
- import_hwp_standards(hwpPath, outputDir): HWP→마크다운
|
|
6
|
+
- import_pdf_standards(pdfPath, outputDir): PDF→마크다운
|
|
7
|
+
- analyze_all(path): 코드분석
|
|
8
|
+
- read_file, list_directory, grep_search: 파일작업
|
|
9
|
+
|
|
10
|
+
Rules:
|
|
11
|
+
1. User request → Call tool immediately
|
|
12
|
+
2. No text output before tool call
|
|
13
|
+
3. After tool result → Summarize in Korean`;
|
|
49
14
|
// Build system prompt with optional context
|
|
50
15
|
function buildSystemPrompt(contextSummary) {
|
|
51
16
|
if (!contextSummary) {
|
|
@@ -141,15 +106,15 @@ export async function* streamProcessMessage(userMessage, history, client, config
|
|
|
141
106
|
yield { type: "thinking" };
|
|
142
107
|
let fullContent = "";
|
|
143
108
|
const pendingToolCalls = [];
|
|
109
|
+
// Collect all events first (non-streaming mode for tools)
|
|
144
110
|
for await (const event of client.streamChat(messages, tools, abortSignal)) {
|
|
145
|
-
// Check if aborted during streaming
|
|
146
111
|
if (abortSignal?.aborted) {
|
|
147
112
|
yield { type: "error", error: "Operation cancelled" };
|
|
148
113
|
return;
|
|
149
114
|
}
|
|
150
115
|
if (event.type === "content" && event.content) {
|
|
151
116
|
fullContent += event.content;
|
|
152
|
-
|
|
117
|
+
// Don't yield content yet - wait to see if there are tool calls
|
|
153
118
|
}
|
|
154
119
|
else if (event.type === "tool_call" && event.toolCall) {
|
|
155
120
|
pendingToolCalls.push(event.toolCall);
|
|
@@ -159,6 +124,14 @@ export async function* streamProcessMessage(userMessage, history, client, config
|
|
|
159
124
|
return;
|
|
160
125
|
}
|
|
161
126
|
}
|
|
127
|
+
// Only yield content if NO tool calls (avoid hallucinated pre-tool text)
|
|
128
|
+
if (pendingToolCalls.length === 0 && fullContent) {
|
|
129
|
+
yield { type: "content", content: fullContent };
|
|
130
|
+
}
|
|
131
|
+
else if (pendingToolCalls.length > 0) {
|
|
132
|
+
// Clear content when tool calls exist
|
|
133
|
+
fullContent = "";
|
|
134
|
+
}
|
|
162
135
|
messages.push({ role: "assistant", content: fullContent, toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined });
|
|
163
136
|
// If no tool calls, we're done
|
|
164
137
|
if (pendingToolCalls.length === 0) {
|
package/dist/core/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,WAAW,EAA8B,MAAM,kBAAkB,CAAC;AAqBxF,MAAM,kBAAkB,GAAG
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiBD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY;IAO1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO/B,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,WAAW,CAAC;IAwChB,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiBD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY;IAO1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO/B,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,WAAW,CAAC;IAwChB,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,CAAC;IAuG9B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,aAAa;IAiBrB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBtD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAQvE"}
|
package/dist/core/llm/ollama.js
CHANGED
|
@@ -36,8 +36,8 @@ export class OllamaClient {
|
|
|
36
36
|
},
|
|
37
37
|
keep_alive: this.keepAlive,
|
|
38
38
|
};
|
|
39
|
-
//
|
|
40
|
-
if (tools?.length
|
|
39
|
+
// Always add tools if provided (needed for multi-turn tool use)
|
|
40
|
+
if (tools?.length) {
|
|
41
41
|
body.tools = tools.map((tool) => ({
|
|
42
42
|
type: "function",
|
|
43
43
|
function: {
|
|
@@ -61,16 +61,20 @@ export class OllamaClient {
|
|
|
61
61
|
}
|
|
62
62
|
async *streamChat(messages, tools, abortSignal) {
|
|
63
63
|
const ollamaMessages = this.convertMessages(messages);
|
|
64
|
+
// Use non-streaming mode when tools are provided to avoid hallucination
|
|
65
|
+
// (LLM often outputs fake results before tool calls in streaming mode)
|
|
66
|
+
const useStreaming = !tools?.length;
|
|
64
67
|
const body = {
|
|
65
68
|
model: this.model,
|
|
66
69
|
messages: ollamaMessages,
|
|
67
|
-
stream:
|
|
70
|
+
stream: useStreaming,
|
|
68
71
|
options: {
|
|
69
72
|
num_ctx: this.contextLength,
|
|
70
73
|
},
|
|
71
74
|
keep_alive: this.keepAlive,
|
|
72
75
|
};
|
|
73
|
-
if (
|
|
76
|
+
// Always add tools if provided (needed for multi-turn tool use)
|
|
77
|
+
if (tools?.length) {
|
|
74
78
|
body.tools = tools.map((tool) => ({
|
|
75
79
|
type: "function",
|
|
76
80
|
function: {
|
|
@@ -91,6 +95,28 @@ export class OllamaClient {
|
|
|
91
95
|
yield { type: "error", error: `Ollama error: ${error}` };
|
|
92
96
|
return;
|
|
93
97
|
}
|
|
98
|
+
// Non-streaming mode for tool calls (avoids hallucination where LLM outputs text before calling tools)
|
|
99
|
+
if (!useStreaming) {
|
|
100
|
+
const data = (await response.json());
|
|
101
|
+
// Handle tool calls first (ignore content when tools are called)
|
|
102
|
+
if (data.message?.tool_calls?.length) {
|
|
103
|
+
for (const tc of data.message.tool_calls) {
|
|
104
|
+
const toolCall = {
|
|
105
|
+
id: `tc_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
106
|
+
name: tc.function.name,
|
|
107
|
+
arguments: tc.function.arguments,
|
|
108
|
+
};
|
|
109
|
+
yield { type: "tool_call", toolCall };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (data.message?.content) {
|
|
113
|
+
// Only yield content if no tool calls
|
|
114
|
+
yield { type: "content", content: data.message.content };
|
|
115
|
+
}
|
|
116
|
+
yield { type: "done" };
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Streaming mode (no tools)
|
|
94
120
|
const reader = response.body?.getReader();
|
|
95
121
|
if (!reader) {
|
|
96
122
|
yield { type: "error", error: "No response body" };
|
|
@@ -98,7 +124,6 @@ export class OllamaClient {
|
|
|
98
124
|
}
|
|
99
125
|
const decoder = new TextDecoder();
|
|
100
126
|
let buffer = "";
|
|
101
|
-
let accumulatedToolCalls = [];
|
|
102
127
|
while (true) {
|
|
103
128
|
const { done, value } = await reader.read();
|
|
104
129
|
if (done)
|
|
@@ -114,17 +139,6 @@ export class OllamaClient {
|
|
|
114
139
|
if (data.message?.content) {
|
|
115
140
|
yield { type: "content", content: data.message.content };
|
|
116
141
|
}
|
|
117
|
-
if (data.message?.tool_calls?.length) {
|
|
118
|
-
for (const tc of data.message.tool_calls) {
|
|
119
|
-
const toolCall = {
|
|
120
|
-
id: `tc_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
121
|
-
name: tc.function.name,
|
|
122
|
-
arguments: tc.function.arguments,
|
|
123
|
-
};
|
|
124
|
-
accumulatedToolCalls.push(toolCall);
|
|
125
|
-
yield { type: "tool_call", toolCall };
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
142
|
if (data.done) {
|
|
129
143
|
yield { type: "done" };
|
|
130
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAgCA,MAAM,OAAO,YAAY;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,aAAa,CAAS;IACtB,SAAS,CAAS;IAE1B,YAAY,MAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwC,CAAC;QAC5E,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAAuB,EACvB,KAAc;QAEd,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,cAAc;YACxB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI,CAAC,aAAa;aAC5B;YACD,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC;QAEF,
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/core/agent.ts
CHANGED
|
@@ -21,53 +21,18 @@ export interface AgentResult {
|
|
|
21
21
|
}>;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
const BASE_SYSTEM_PROMPT = `You are ACTIVO
|
|
24
|
+
const BASE_SYSTEM_PROMPT = `You are ACTIVO. Call tools immediately. No explanation before tool calls.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Tools:
|
|
27
|
+
- import_hwp_standards(hwpPath, outputDir): HWP→마크다운
|
|
28
|
+
- import_pdf_standards(pdfPath, outputDir): PDF→마크다운
|
|
29
|
+
- analyze_all(path): 코드분석
|
|
30
|
+
- read_file, list_directory, grep_search: 파일작업
|
|
27
31
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
실행 중... ← NO!
|
|
33
|
-
[some explanation] ← NO!
|
|
34
|
-
tool_call(...)
|
|
35
|
-
결과: ... ← NO! (you don't have results yet)
|
|
36
|
-
\`\`\`
|
|
37
|
-
|
|
38
|
-
CORRECT:
|
|
39
|
-
\`\`\`
|
|
40
|
-
tool_call(...)
|
|
41
|
-
\`\`\`
|
|
42
|
-
|
|
43
|
-
## AFTER TOOL RETURNS
|
|
44
|
-
|
|
45
|
-
Only AFTER you receive the actual tool result, you may write a response summarizing what the tool returned.
|
|
46
|
-
|
|
47
|
-
## HALLUCINATION = FAILURE
|
|
48
|
-
|
|
49
|
-
If you write ANY of these WITHOUT a tool result, you have FAILED:
|
|
50
|
-
- File names (e.g., "UserService.java")
|
|
51
|
-
- Numbers (e.g., "복잡도: 15", "3개 파일")
|
|
52
|
-
- Paths (e.g., "/path/to/file.md")
|
|
53
|
-
- Status messages (e.g., "변환 완료!", "성공")
|
|
54
|
-
|
|
55
|
-
## Tools
|
|
56
|
-
|
|
57
|
-
- analyze_all: 코드 분석
|
|
58
|
-
- import_pdf_standards: PDF→마크다운 (pdfPath 필수)
|
|
59
|
-
- import_hwp_standards: HWP→마크다운 (hwpPath 필수)
|
|
60
|
-
- read_file, write_file, list_directory, grep_search, glob_search: 파일
|
|
61
|
-
|
|
62
|
-
## Example
|
|
63
|
-
|
|
64
|
-
User: "HWP 파일을 마크다운으로 변환해줘"
|
|
65
|
-
|
|
66
|
-
YOUR RESPONSE (no other text):
|
|
67
|
-
→ Call import_hwp_standards with hwpPath
|
|
68
|
-
|
|
69
|
-
AFTER tool returns result:
|
|
70
|
-
→ Now you can summarize the actual result`;
|
|
32
|
+
Rules:
|
|
33
|
+
1. User request → Call tool immediately
|
|
34
|
+
2. No text output before tool call
|
|
35
|
+
3. After tool result → Summarize in Korean`;
|
|
71
36
|
|
|
72
37
|
// Build system prompt with optional context
|
|
73
38
|
function buildSystemPrompt(contextSummary?: string): string {
|
|
@@ -203,15 +168,15 @@ export async function* streamProcessMessage(
|
|
|
203
168
|
let fullContent = "";
|
|
204
169
|
const pendingToolCalls: ToolCall[] = [];
|
|
205
170
|
|
|
171
|
+
// Collect all events first (non-streaming mode for tools)
|
|
206
172
|
for await (const event of client.streamChat(messages, tools as Tool[], abortSignal)) {
|
|
207
|
-
// Check if aborted during streaming
|
|
208
173
|
if (abortSignal?.aborted) {
|
|
209
174
|
yield { type: "error", error: "Operation cancelled" };
|
|
210
175
|
return;
|
|
211
176
|
}
|
|
212
177
|
if (event.type === "content" && event.content) {
|
|
213
178
|
fullContent += event.content;
|
|
214
|
-
|
|
179
|
+
// Don't yield content yet - wait to see if there are tool calls
|
|
215
180
|
} else if (event.type === "tool_call" && event.toolCall) {
|
|
216
181
|
pendingToolCalls.push(event.toolCall);
|
|
217
182
|
} else if (event.type === "error") {
|
|
@@ -220,6 +185,14 @@ export async function* streamProcessMessage(
|
|
|
220
185
|
}
|
|
221
186
|
}
|
|
222
187
|
|
|
188
|
+
// Only yield content if NO tool calls (avoid hallucinated pre-tool text)
|
|
189
|
+
if (pendingToolCalls.length === 0 && fullContent) {
|
|
190
|
+
yield { type: "content", content: fullContent };
|
|
191
|
+
} else if (pendingToolCalls.length > 0) {
|
|
192
|
+
// Clear content when tool calls exist
|
|
193
|
+
fullContent = "";
|
|
194
|
+
}
|
|
195
|
+
|
|
223
196
|
messages.push({ role: "assistant", content: fullContent, toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined });
|
|
224
197
|
|
|
225
198
|
// If no tool calls, we're done
|
package/src/core/llm/ollama.ts
CHANGED
|
@@ -75,8 +75,8 @@ export class OllamaClient {
|
|
|
75
75
|
keep_alive: this.keepAlive,
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
//
|
|
79
|
-
if (tools?.length
|
|
78
|
+
// Always add tools if provided (needed for multi-turn tool use)
|
|
79
|
+
if (tools?.length) {
|
|
80
80
|
body.tools = tools.map((tool) => ({
|
|
81
81
|
type: "function",
|
|
82
82
|
function: {
|
|
@@ -109,17 +109,22 @@ export class OllamaClient {
|
|
|
109
109
|
): AsyncGenerator<StreamEvent> {
|
|
110
110
|
const ollamaMessages = this.convertMessages(messages);
|
|
111
111
|
|
|
112
|
+
// Use non-streaming mode when tools are provided to avoid hallucination
|
|
113
|
+
// (LLM often outputs fake results before tool calls in streaming mode)
|
|
114
|
+
const useStreaming = !tools?.length;
|
|
115
|
+
|
|
112
116
|
const body: Record<string, unknown> = {
|
|
113
117
|
model: this.model,
|
|
114
118
|
messages: ollamaMessages,
|
|
115
|
-
stream:
|
|
119
|
+
stream: useStreaming,
|
|
116
120
|
options: {
|
|
117
121
|
num_ctx: this.contextLength,
|
|
118
122
|
},
|
|
119
123
|
keep_alive: this.keepAlive,
|
|
120
124
|
};
|
|
121
125
|
|
|
122
|
-
if (
|
|
126
|
+
// Always add tools if provided (needed for multi-turn tool use)
|
|
127
|
+
if (tools?.length) {
|
|
123
128
|
body.tools = tools.map((tool) => ({
|
|
124
129
|
type: "function",
|
|
125
130
|
function: {
|
|
@@ -143,6 +148,30 @@ export class OllamaClient {
|
|
|
143
148
|
return;
|
|
144
149
|
}
|
|
145
150
|
|
|
151
|
+
// Non-streaming mode for tool calls (avoids hallucination where LLM outputs text before calling tools)
|
|
152
|
+
if (!useStreaming) {
|
|
153
|
+
const data = (await response.json()) as OllamaChatResponse;
|
|
154
|
+
|
|
155
|
+
// Handle tool calls first (ignore content when tools are called)
|
|
156
|
+
if (data.message?.tool_calls?.length) {
|
|
157
|
+
for (const tc of data.message.tool_calls) {
|
|
158
|
+
const toolCall: ToolCall = {
|
|
159
|
+
id: `tc_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
160
|
+
name: tc.function.name,
|
|
161
|
+
arguments: tc.function.arguments,
|
|
162
|
+
};
|
|
163
|
+
yield { type: "tool_call", toolCall };
|
|
164
|
+
}
|
|
165
|
+
} else if (data.message?.content) {
|
|
166
|
+
// Only yield content if no tool calls
|
|
167
|
+
yield { type: "content", content: data.message.content };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
yield { type: "done" };
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Streaming mode (no tools)
|
|
146
175
|
const reader = response.body?.getReader();
|
|
147
176
|
if (!reader) {
|
|
148
177
|
yield { type: "error", error: "No response body" };
|
|
@@ -151,7 +180,6 @@ export class OllamaClient {
|
|
|
151
180
|
|
|
152
181
|
const decoder = new TextDecoder();
|
|
153
182
|
let buffer = "";
|
|
154
|
-
let accumulatedToolCalls: ToolCall[] = [];
|
|
155
183
|
|
|
156
184
|
while (true) {
|
|
157
185
|
const { done, value } = await reader.read();
|
|
@@ -171,18 +199,6 @@ export class OllamaClient {
|
|
|
171
199
|
yield { type: "content", content: data.message.content };
|
|
172
200
|
}
|
|
173
201
|
|
|
174
|
-
if (data.message?.tool_calls?.length) {
|
|
175
|
-
for (const tc of data.message.tool_calls) {
|
|
176
|
-
const toolCall: ToolCall = {
|
|
177
|
-
id: `tc_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
178
|
-
name: tc.function.name,
|
|
179
|
-
arguments: tc.function.arguments,
|
|
180
|
-
};
|
|
181
|
-
accumulatedToolCalls.push(toolCall);
|
|
182
|
-
yield { type: "tool_call", toolCall };
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
202
|
if (data.done) {
|
|
187
203
|
yield { type: "done" };
|
|
188
204
|
}
|