Skip to content

Commit c8632a4

Browse files
committed
调整skills加载
1 parent 595e21d commit c8632a4

4 files changed

Lines changed: 49 additions & 42 deletions

File tree

sharpclaw/Agents/MainAgent.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,6 @@ public MainAgent(
131131
archiver: archiver,
132132
memorySaver: memorySaver);
133133

134-
135-
#pragma warning disable MAAI001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
136-
var skillsProvider = new FileAgentSkillsProvider(skillPath: _agentContext.GetSkillsDirPath());
137-
#pragma warning restore MAAI001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
138-
139134
_agent = new ChatClientBuilder(mainClient)
140135
.UseFunctionInvocation()
141136
.UseChatReducer(_reducer)
@@ -145,8 +140,7 @@ public MainAgent(
145140
{
146141
Instructions = systemPrompt,
147142
Tools = tools
148-
},
149-
AIContextProviders = [skillsProvider]
143+
}
150144
});
151145
}
152146

sharpclaw/Chat/MemoryPipelineChatReducer.cs

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ public async Task<IEnumerable<ChatMessage>> ReduceAsync(
110110
ArchiveResult? archiveResult = null;
111111

112112
List<ChatMessage> allMessages = [.. OldWorkingMemoryContent, .. conversationMessages];
113-
if (allMessages.Sum(x => x.Contents.Count()) > _resetThreshold)
113+
var messageText = ConvertMessagesToText(allMessages).Replace(" ", "");
114+
if (messageText.Length > 200000)
114115
{
115116
// 进入裁剪,清空累积的工作记忆
116117
OldWorkingMemoryContent.Clear();
@@ -181,6 +182,44 @@ public async Task<IEnumerable<ChatMessage>> ReduceAsync(
181182
return result;
182183
}
183184

185+
private string ConvertMessagesToText(IEnumerable<ChatMessage> messages)
186+
{
187+
var sb = new StringBuilder();
188+
foreach (var msg in messages)
189+
{
190+
if (msg.Role == ChatRole.User)
191+
{
192+
var text = string.Join("", msg.Contents.OfType<TextContent>()
193+
.Where(t => !string.IsNullOrWhiteSpace(t.Text))
194+
.Select(t => t.Text.Trim()));
195+
if (!string.IsNullOrWhiteSpace(text))
196+
sb.Append($"### 用户\n\n{text}\n\n");
197+
continue;
198+
}
199+
200+
foreach (var content in msg.Contents)
201+
{
202+
switch (content)
203+
{
204+
case TextContent text when !string.IsNullOrWhiteSpace(text.Text):
205+
sb.Append($"### 助手\n\n{text.Text.Trim()}\n\n");
206+
break;
207+
case FunctionCallContent call:
208+
var args = call.Arguments is not null
209+
? JsonSerializer.Serialize(call.Arguments)
210+
: "";
211+
sb.Append($"#### 工具调用: {call.Name}\n\n参数: `{args}`\n\n");
212+
break;
213+
case FunctionResultContent result:
214+
var resultText = result.Result?.ToString() ?? "";
215+
sb.Append($"<details>\n<summary>执行结果</summary>\n\n```\n{resultText}\n```\n\n</details>\n\n");
216+
break;
217+
}
218+
}
219+
}
220+
return sb.ToString();
221+
}
222+
184223
private async Task SaveHistoryFileAsync(
185224
IReadOnlyList<ChatMessage> messages,
186225
CancellationToken cancellationToken)
@@ -196,39 +235,7 @@ private async Task SaveHistoryFileAsync(
196235

197236
var sb = new StringBuilder();
198237
sb.Append($"# 对话历史 {DateTime.Now:yyyy-MM-dd HH:mm:ss}\n\n");
199-
200-
foreach (var msg in messages)
201-
{
202-
if (msg.Role == ChatRole.User)
203-
{
204-
var text = string.Join("", msg.Contents.OfType<TextContent>()
205-
.Where(t => !string.IsNullOrWhiteSpace(t.Text))
206-
.Select(t => t.Text.Trim()));
207-
if (!string.IsNullOrWhiteSpace(text))
208-
sb.Append($"### 用户\n\n{text}\n\n");
209-
continue;
210-
}
211-
212-
foreach (var content in msg.Contents)
213-
{
214-
switch (content)
215-
{
216-
case TextContent text when !string.IsNullOrWhiteSpace(text.Text):
217-
sb.Append($"### 助手\n\n{text.Text.Trim()}\n\n");
218-
break;
219-
case FunctionCallContent call:
220-
var args = call.Arguments is not null
221-
? JsonSerializer.Serialize(call.Arguments)
222-
: "";
223-
sb.Append($"#### 工具调用: {call.Name}\n\n参数: `{args}`\n\n");
224-
break;
225-
case FunctionResultContent result:
226-
var resultText = result.Result?.ToString() ?? "";
227-
sb.Append($"<details>\n<summary>执行结果</summary>\n\n```\n{resultText}\n```\n\n</details>\n\n");
228-
break;
229-
}
230-
}
231-
}
238+
sb.Append(ConvertMessagesToText(messages));
232239

233240
await File.WriteAllTextAsync(filePath, sb.ToString(), cancellationToken);
234241
AppLogger.Log($"[Archive] 已保存历史文件: {fileName}{messages.Count} 条消息)");

sharpclaw/Core/AgentBootstrap.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using AgentSkillsDotNet;
12
using Microsoft.Extensions.AI;
23
using sharpclaw.Commands;
34
using sharpclaw.Core.TaskManagement;
@@ -77,8 +78,12 @@ public static BootstrapResult Initialize()
7778
if (!Directory.Exists(skillsDirPath))
7879
Directory.CreateDirectory(skillsDirPath);
7980

81+
var agentSkillsFactory = new AgentSkillsFactory();
82+
var agentSkills = agentSkillsFactory.GetAgentSkills(skillsDirPath);
83+
var skillTools = agentSkills.GetAsTools();
84+
8085
var memoryStore = ClientFactory.CreateMemoryStore(config);
8186

82-
return new BootstrapResult(config, taskManager, commandSkills, memoryStore, agentContext);
87+
return new BootstrapResult(config, taskManager, [.. commandSkills, .. skillTools], memoryStore, agentContext);
8388
}
8489
}

sharpclaw/sharpclaw.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
</ItemGroup>
1313

1414
<ItemGroup>
15+
<PackageReference Include="AgentSkillsDotNet" Version="1.0.0-rc2" />
1516
<PackageReference Include="Anthropic" Version="12.5.0" />
1617
<PackageReference Include="Cronos" Version="0.11.1" />
1718
<PackageReference Include="GeminiDotnet.Extensions.AI" Version="0.22.0" />

0 commit comments

Comments
 (0)