activo 0.3.7 → 0.3.9
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 +55 -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 +55 -49
- 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;AAgED,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,49 @@
|
|
|
1
1
|
import { getAllTools, executeTool } from "./tools/index.js";
|
|
2
|
-
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer.
|
|
3
|
-
|
|
4
|
-
##
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
→ Call
|
|
46
|
-
|
|
47
|
-
AFTER tool returns result:
|
|
48
|
-
→ Now you can summarize the actual result`;
|
|
2
|
+
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer. You MUST call tools to perform tasks.
|
|
3
|
+
|
|
4
|
+
## CRITICAL RULES
|
|
5
|
+
1. Call tool IMMEDIATELY when user requests an action
|
|
6
|
+
2. NEVER output text before calling a tool
|
|
7
|
+
3. NEVER fabricate results - only report actual tool output
|
|
8
|
+
4. After tool returns, summarize in user's language (Korean if user speaks Korean)
|
|
9
|
+
|
|
10
|
+
## TOOLS BY CATEGORY
|
|
11
|
+
|
|
12
|
+
### Document Conversion
|
|
13
|
+
- import_hwp_standards(hwpPath, outputDir): Convert HWP to markdown
|
|
14
|
+
- import_pdf_standards(pdfPath, outputDir): Convert PDF to markdown
|
|
15
|
+
|
|
16
|
+
### Code Analysis (Recommended: use analyze_all)
|
|
17
|
+
- analyze_all(path, include?): Analyze all code (Java/JS/TS/Python)
|
|
18
|
+
- java_analyze(path): Java code analysis
|
|
19
|
+
- java_complexity(path): Java complexity metrics
|
|
20
|
+
- spring_check(path): Spring pattern check
|
|
21
|
+
- ast_analyze(path): JS/TS AST analysis
|
|
22
|
+
- react_check(path): React pattern check
|
|
23
|
+
- vue_check(path): Vue pattern check
|
|
24
|
+
- python_check(path): Python code analysis
|
|
25
|
+
|
|
26
|
+
### SQL/DB Analysis
|
|
27
|
+
- sql_check(path): SQL query analysis
|
|
28
|
+
- mybatis_check(path): MyBatis mapper analysis
|
|
29
|
+
|
|
30
|
+
### Web Analysis
|
|
31
|
+
- css_check(path): CSS analysis
|
|
32
|
+
- html_check(path): HTML analysis
|
|
33
|
+
- dependency_check(path): package.json dependency analysis
|
|
34
|
+
- openapi_check(path): OpenAPI spec analysis
|
|
35
|
+
|
|
36
|
+
### File Operations
|
|
37
|
+
- read_file(path): Read file content
|
|
38
|
+
- write_file(path, content): Write file
|
|
39
|
+
- list_directory(path): List directory contents
|
|
40
|
+
- grep_search(pattern, path): Search pattern in files
|
|
41
|
+
- glob_search(pattern): Search files by pattern
|
|
42
|
+
|
|
43
|
+
## EXAMPLE
|
|
44
|
+
User: "Analyze src folder"
|
|
45
|
+
→ Call analyze_all(path="src") immediately
|
|
46
|
+
→ After result: Summarize findings`;
|
|
49
47
|
// Build system prompt with optional context
|
|
50
48
|
function buildSystemPrompt(contextSummary) {
|
|
51
49
|
if (!contextSummary) {
|
|
@@ -141,15 +139,15 @@ export async function* streamProcessMessage(userMessage, history, client, config
|
|
|
141
139
|
yield { type: "thinking" };
|
|
142
140
|
let fullContent = "";
|
|
143
141
|
const pendingToolCalls = [];
|
|
142
|
+
// Collect all events first (non-streaming mode for tools)
|
|
144
143
|
for await (const event of client.streamChat(messages, tools, abortSignal)) {
|
|
145
|
-
// Check if aborted during streaming
|
|
146
144
|
if (abortSignal?.aborted) {
|
|
147
145
|
yield { type: "error", error: "Operation cancelled" };
|
|
148
146
|
return;
|
|
149
147
|
}
|
|
150
148
|
if (event.type === "content" && event.content) {
|
|
151
149
|
fullContent += event.content;
|
|
152
|
-
|
|
150
|
+
// Don't yield content yet - wait to see if there are tool calls
|
|
153
151
|
}
|
|
154
152
|
else if (event.type === "tool_call" && event.toolCall) {
|
|
155
153
|
pendingToolCalls.push(event.toolCall);
|
|
@@ -159,6 +157,14 @@ export async function* streamProcessMessage(userMessage, history, client, config
|
|
|
159
157
|
return;
|
|
160
158
|
}
|
|
161
159
|
}
|
|
160
|
+
// Only yield content if NO tool calls (avoid hallucinated pre-tool text)
|
|
161
|
+
if (pendingToolCalls.length === 0 && fullContent) {
|
|
162
|
+
yield { type: "content", content: fullContent };
|
|
163
|
+
}
|
|
164
|
+
else if (pendingToolCalls.length > 0) {
|
|
165
|
+
// Clear content when tool calls exist
|
|
166
|
+
fullContent = "";
|
|
167
|
+
}
|
|
162
168
|
messages.push({ role: "assistant", content: fullContent, toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined });
|
|
163
169
|
// If no tool calls, we're done
|
|
164
170
|
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,51 @@ export interface AgentResult {
|
|
|
21
21
|
}>;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer.
|
|
25
|
-
|
|
26
|
-
##
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
→ Call
|
|
68
|
-
|
|
69
|
-
AFTER tool returns result:
|
|
70
|
-
→ Now you can summarize the actual result`;
|
|
24
|
+
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer. You MUST call tools to perform tasks.
|
|
25
|
+
|
|
26
|
+
## CRITICAL RULES
|
|
27
|
+
1. Call tool IMMEDIATELY when user requests an action
|
|
28
|
+
2. NEVER output text before calling a tool
|
|
29
|
+
3. NEVER fabricate results - only report actual tool output
|
|
30
|
+
4. After tool returns, summarize in user's language (Korean if user speaks Korean)
|
|
31
|
+
|
|
32
|
+
## TOOLS BY CATEGORY
|
|
33
|
+
|
|
34
|
+
### Document Conversion
|
|
35
|
+
- import_hwp_standards(hwpPath, outputDir): Convert HWP to markdown
|
|
36
|
+
- import_pdf_standards(pdfPath, outputDir): Convert PDF to markdown
|
|
37
|
+
|
|
38
|
+
### Code Analysis (Recommended: use analyze_all)
|
|
39
|
+
- analyze_all(path, include?): Analyze all code (Java/JS/TS/Python)
|
|
40
|
+
- java_analyze(path): Java code analysis
|
|
41
|
+
- java_complexity(path): Java complexity metrics
|
|
42
|
+
- spring_check(path): Spring pattern check
|
|
43
|
+
- ast_analyze(path): JS/TS AST analysis
|
|
44
|
+
- react_check(path): React pattern check
|
|
45
|
+
- vue_check(path): Vue pattern check
|
|
46
|
+
- python_check(path): Python code analysis
|
|
47
|
+
|
|
48
|
+
### SQL/DB Analysis
|
|
49
|
+
- sql_check(path): SQL query analysis
|
|
50
|
+
- mybatis_check(path): MyBatis mapper analysis
|
|
51
|
+
|
|
52
|
+
### Web Analysis
|
|
53
|
+
- css_check(path): CSS analysis
|
|
54
|
+
- html_check(path): HTML analysis
|
|
55
|
+
- dependency_check(path): package.json dependency analysis
|
|
56
|
+
- openapi_check(path): OpenAPI spec analysis
|
|
57
|
+
|
|
58
|
+
### File Operations
|
|
59
|
+
- read_file(path): Read file content
|
|
60
|
+
- write_file(path, content): Write file
|
|
61
|
+
- list_directory(path): List directory contents
|
|
62
|
+
- grep_search(pattern, path): Search pattern in files
|
|
63
|
+
- glob_search(pattern): Search files by pattern
|
|
64
|
+
|
|
65
|
+
## EXAMPLE
|
|
66
|
+
User: "Analyze src folder"
|
|
67
|
+
→ Call analyze_all(path="src") immediately
|
|
68
|
+
→ After result: Summarize findings`;
|
|
71
69
|
|
|
72
70
|
// Build system prompt with optional context
|
|
73
71
|
function buildSystemPrompt(contextSummary?: string): string {
|
|
@@ -203,15 +201,15 @@ export async function* streamProcessMessage(
|
|
|
203
201
|
let fullContent = "";
|
|
204
202
|
const pendingToolCalls: ToolCall[] = [];
|
|
205
203
|
|
|
204
|
+
// Collect all events first (non-streaming mode for tools)
|
|
206
205
|
for await (const event of client.streamChat(messages, tools as Tool[], abortSignal)) {
|
|
207
|
-
// Check if aborted during streaming
|
|
208
206
|
if (abortSignal?.aborted) {
|
|
209
207
|
yield { type: "error", error: "Operation cancelled" };
|
|
210
208
|
return;
|
|
211
209
|
}
|
|
212
210
|
if (event.type === "content" && event.content) {
|
|
213
211
|
fullContent += event.content;
|
|
214
|
-
|
|
212
|
+
// Don't yield content yet - wait to see if there are tool calls
|
|
215
213
|
} else if (event.type === "tool_call" && event.toolCall) {
|
|
216
214
|
pendingToolCalls.push(event.toolCall);
|
|
217
215
|
} else if (event.type === "error") {
|
|
@@ -220,6 +218,14 @@ export async function* streamProcessMessage(
|
|
|
220
218
|
}
|
|
221
219
|
}
|
|
222
220
|
|
|
221
|
+
// Only yield content if NO tool calls (avoid hallucinated pre-tool text)
|
|
222
|
+
if (pendingToolCalls.length === 0 && fullContent) {
|
|
223
|
+
yield { type: "content", content: fullContent };
|
|
224
|
+
} else if (pendingToolCalls.length > 0) {
|
|
225
|
+
// Clear content when tool calls exist
|
|
226
|
+
fullContent = "";
|
|
227
|
+
}
|
|
228
|
+
|
|
223
229
|
messages.push({ role: "assistant", content: fullContent, toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined });
|
|
224
230
|
|
|
225
231
|
// 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
|
}
|