activo 0.3.6 → 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 -46
- 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 -44
- 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;AA+
|
|
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,48 +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
|
-
## Available Tools
|
|
15
|
-
|
|
16
|
-
- analyze_all: 디렉토리 전체 분석 (권장)
|
|
17
|
-
- java_analyze, java_complexity, spring_check: Java 분석
|
|
18
|
-
- sql_check, mybatis_check: SQL/MyBatis 분석
|
|
19
|
-
- ast_analyze, react_check, vue_check, jquery_check: JS/TS 분석
|
|
20
|
-
- css_check, html_check: CSS/HTML 분석
|
|
21
|
-
- dependency_check, openapi_check, python_check: 기타
|
|
22
|
-
- read_file, write_file, list_directory, grep_search, glob_search: 파일 작업
|
|
23
|
-
- import_pdf_standards: PDF를 마크다운으로 변환 (pdfPath 필수)
|
|
24
|
-
- import_hwp_standards: HWP(한글)를 마크다운으로 변환 (hwpPath 필수)
|
|
25
|
-
|
|
26
|
-
## Correct Behavior
|
|
27
|
-
|
|
28
|
-
User: "src/**/*.java 분석해줘"
|
|
29
|
-
→ IMMEDIATELY call: analyze_all(path="src", include=["java"])
|
|
30
|
-
→ Then summarize the ACTUAL results returned by the tool
|
|
31
|
-
|
|
32
|
-
## WRONG Behavior (NEVER DO THIS)
|
|
33
|
-
|
|
34
|
-
❌ Writing fake file names like "OrderService.java", "UserController.java"
|
|
35
|
-
❌ Making up complexity scores like "복잡도: 15"
|
|
36
|
-
❌ Inventing issues that weren't found by tools
|
|
37
|
-
❌ Saying "실행 결과:" without actually executing tools
|
|
38
|
-
❌ Creating tables with fictional data
|
|
39
|
-
|
|
40
|
-
## Response Format
|
|
41
|
-
|
|
42
|
-
1. Call the appropriate tool(s)
|
|
43
|
-
2. Wait for actual results
|
|
44
|
-
3. Summarize ONLY what the tool returned
|
|
45
|
-
4. Use Korean if user speaks Korean`;
|
|
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`;
|
|
46
14
|
// Build system prompt with optional context
|
|
47
15
|
function buildSystemPrompt(contextSummary) {
|
|
48
16
|
if (!contextSummary) {
|
|
@@ -138,15 +106,15 @@ export async function* streamProcessMessage(userMessage, history, client, config
|
|
|
138
106
|
yield { type: "thinking" };
|
|
139
107
|
let fullContent = "";
|
|
140
108
|
const pendingToolCalls = [];
|
|
109
|
+
// Collect all events first (non-streaming mode for tools)
|
|
141
110
|
for await (const event of client.streamChat(messages, tools, abortSignal)) {
|
|
142
|
-
// Check if aborted during streaming
|
|
143
111
|
if (abortSignal?.aborted) {
|
|
144
112
|
yield { type: "error", error: "Operation cancelled" };
|
|
145
113
|
return;
|
|
146
114
|
}
|
|
147
115
|
if (event.type === "content" && event.content) {
|
|
148
116
|
fullContent += event.content;
|
|
149
|
-
|
|
117
|
+
// Don't yield content yet - wait to see if there are tool calls
|
|
150
118
|
}
|
|
151
119
|
else if (event.type === "tool_call" && event.toolCall) {
|
|
152
120
|
pendingToolCalls.push(event.toolCall);
|
|
@@ -156,6 +124,14 @@ export async function* streamProcessMessage(userMessage, history, client, config
|
|
|
156
124
|
return;
|
|
157
125
|
}
|
|
158
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
|
+
}
|
|
159
135
|
messages.push({ role: "assistant", content: fullContent, toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined });
|
|
160
136
|
// If no tool calls, we're done
|
|
161
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,50 +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
|
-
2.
|
|
31
|
-
|
|
32
|
-
3. **NO PLANNING OR PROMISES**: Do NOT say "I will analyze", "Let me check", "작업 계획", "실행 순서", "진행 중" etc. Just call the tool immediately.
|
|
33
|
-
|
|
34
|
-
4. **ONLY REPORT ACTUAL TOOL OUTPUT**: After a tool returns results, summarize ONLY what the tool actually returned. Never add fictional examples.
|
|
35
|
-
|
|
36
|
-
## Available Tools
|
|
37
|
-
|
|
38
|
-
- analyze_all: 디렉토리 전체 분석 (권장)
|
|
39
|
-
- java_analyze, java_complexity, spring_check: Java 분석
|
|
40
|
-
- sql_check, mybatis_check: SQL/MyBatis 분석
|
|
41
|
-
- ast_analyze, react_check, vue_check, jquery_check: JS/TS 분석
|
|
42
|
-
- css_check, html_check: CSS/HTML 분석
|
|
43
|
-
- dependency_check, openapi_check, python_check: 기타
|
|
44
|
-
- read_file, write_file, list_directory, grep_search, glob_search: 파일 작업
|
|
45
|
-
- import_pdf_standards: PDF를 마크다운으로 변환 (pdfPath 필수)
|
|
46
|
-
- import_hwp_standards: HWP(한글)를 마크다운으로 변환 (hwpPath 필수)
|
|
47
|
-
|
|
48
|
-
## Correct Behavior
|
|
49
|
-
|
|
50
|
-
User: "src/**/*.java 분석해줘"
|
|
51
|
-
→ IMMEDIATELY call: analyze_all(path="src", include=["java"])
|
|
52
|
-
→ Then summarize the ACTUAL results returned by the tool
|
|
53
|
-
|
|
54
|
-
## WRONG Behavior (NEVER DO THIS)
|
|
55
|
-
|
|
56
|
-
❌ Writing fake file names like "OrderService.java", "UserController.java"
|
|
57
|
-
❌ Making up complexity scores like "복잡도: 15"
|
|
58
|
-
❌ Inventing issues that weren't found by tools
|
|
59
|
-
❌ Saying "실행 결과:" without actually executing tools
|
|
60
|
-
❌ Creating tables with fictional data
|
|
61
|
-
|
|
62
|
-
## Response Format
|
|
63
|
-
|
|
64
|
-
1. Call the appropriate tool(s)
|
|
65
|
-
2. Wait for actual results
|
|
66
|
-
3. Summarize ONLY what the tool returned
|
|
67
|
-
4. Use Korean if user speaks Korean`;
|
|
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`;
|
|
68
36
|
|
|
69
37
|
// Build system prompt with optional context
|
|
70
38
|
function buildSystemPrompt(contextSummary?: string): string {
|
|
@@ -200,15 +168,15 @@ export async function* streamProcessMessage(
|
|
|
200
168
|
let fullContent = "";
|
|
201
169
|
const pendingToolCalls: ToolCall[] = [];
|
|
202
170
|
|
|
171
|
+
// Collect all events first (non-streaming mode for tools)
|
|
203
172
|
for await (const event of client.streamChat(messages, tools as Tool[], abortSignal)) {
|
|
204
|
-
// Check if aborted during streaming
|
|
205
173
|
if (abortSignal?.aborted) {
|
|
206
174
|
yield { type: "error", error: "Operation cancelled" };
|
|
207
175
|
return;
|
|
208
176
|
}
|
|
209
177
|
if (event.type === "content" && event.content) {
|
|
210
178
|
fullContent += event.content;
|
|
211
|
-
|
|
179
|
+
// Don't yield content yet - wait to see if there are tool calls
|
|
212
180
|
} else if (event.type === "tool_call" && event.toolCall) {
|
|
213
181
|
pendingToolCalls.push(event.toolCall);
|
|
214
182
|
} else if (event.type === "error") {
|
|
@@ -217,6 +185,14 @@ export async function* streamProcessMessage(
|
|
|
217
185
|
}
|
|
218
186
|
}
|
|
219
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
|
+
|
|
220
196
|
messages.push({ role: "assistant", content: fullContent, toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined });
|
|
221
197
|
|
|
222
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
|
}
|