-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasic_chat.py
More file actions
100 lines (82 loc) · 3.4 KB
/
Copy pathbasic_chat.py
File metadata and controls
100 lines (82 loc) · 3.4 KB
1
2
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
KKCode 基础对话示例
==================
演示如何用 KKCode 的 Agent 进行一次非交互式编程对话。
Agent 会自动调用工具(读文件、写文件、执行命令)来完成用户指令。
运行方式:
cd /path/to/kkcode
kkcode -p "帮我写一个 Python 快速排序" --mode bypass
或以模块方式导入(本示例):
python examples/basic_chat.py
前提:
- 已配置 .kkcode/config.yaml(LLM API Key)
- 已安装依赖:uv sync
"""
import asyncio
import sys
import os
# 确保项目根目录在 sys.path 中,方便 import kkcode
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from kkcode.config import load_config
from kkcode.client import create_client, resolve_context_window
from kkcode.agent import Agent, StreamText, ToolUseEvent, LoopComplete
from kkcode.tools import create_default_registry
from kkcode.permissions import PermissionChecker, DangerousCommandDetector, PathSandbox, RuleEngine
from kkcode.permissions import PermissionMode
from kkcode.conversation import ConversationManager
from kkcode.memory.instructions import load_instructions
async def main() -> None:
# 1. 加载配置(从 .kkcode/config.yaml)
config = load_config()
provider = config.providers[0]
print(f"[KKCode] 使用模型: {provider.model} ({provider.base_url})")
# 2. 创建 LLM 客户端
client = create_client(provider)
await resolve_context_window(provider)
# 3. 构建权限检查器(bypass 模式:自动批准所有操作)
checker = PermissionChecker(
detector=DangerousCommandDetector(),
sandbox=PathSandbox(os.getcwd()),
rule_engine=RuleEngine(),
mode=PermissionMode.BYPASS,
)
# 4. 注册默认工具集(文件读写、Shell 执行、搜索等)
registry = create_default_registry()
# 5. 创建 Agent
agent = Agent(
client=client,
registry=registry,
protocol=provider.protocol,
work_dir=os.getcwd(),
permission_checker=checker,
context_window=provider.get_context_window(),
instructions_content=load_instructions(os.getcwd()),
)
# 6. 构建对话并发送用户消息
conv = ConversationManager()
user_prompt = (
"在当前目录创建一个 hello_kkcode.py 文件,"
"内容是一个打印 'Hello KKCode!' 的 Python 脚本。"
)
conv.add_user_message(user_prompt)
print(f"[KKCode] 用户: {user_prompt}")
print("[KKCode] Agent 思考中...\n")
# 7. 事件驱动循环:实时输出 Agent 的思考、工具调用和文本
async for event in agent.run(conv):
if isinstance(event, StreamText):
print(event.text, end="", flush=True)
elif isinstance(event, ToolUseEvent):
print(f"\n [工具调用] {event.tool_name}({event.arguments})", flush=True)
elif isinstance(event, LoopComplete):
print(f"\n\n[KKCode] 完成! 共 {event.total_turns} 轮对话")
break
# 验证生成的文件
output_file = os.path.join(os.getcwd(), "hello_kkcode.py")
if os.path.exists(output_file):
print(f"\n[验证] 文件已生成: {output_file}")
with open(output_file, encoding="utf-8") as f:
print(f"[内容]\n{f.read()}")
else:
print(f"\n[验证] 文件未生成(可能 Agent 选择了其他方式)")
if __name__ == "__main__":
asyncio.run(main())