AX Agent 코워크·코드 흐름과 컨텍스트 관리를 claude-code 기준으로 대폭 정리
- 코워크·코드 프롬프트, 도구 선택, 문서 생성/검증 흐름을 claude-code 동등 품질 기준으로 재정렬함 - OpenAI/vLLM 경로의 오래된 tool history를 평탄화하고 최근 이력만 구조화해 컨텍스트 직렬화를 경량화함 - AX Agent UI를 테마 기준으로 재구성하고 플랜 승인/오버레이/이벤트 렌더링/명령 입력 상호작용을 개선함 - 파일 후보 제안, 반복 경로 정체 복구, LSP 보강, 문서·PPT 처리 개선, 설정/서비스 인터페이스 정리를 함께 반영함 - README.md 및 docs/DEVELOPMENT.md를 작업 시점별로 갱신함 - 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0, 오류 0)
This commit is contained in:
@@ -18,7 +18,7 @@ public record TokenUsage(int PromptTokens, int CompletionTokens)
|
||||
/// LLM API 호출 서비스. Ollama / vLLM / Gemini / Claude 백엔드를 지원합니다.
|
||||
/// 스트리밍(SSE) 및 비스트리밍 모두 지원합니다.
|
||||
/// </summary>
|
||||
public partial class LlmService : IDisposable
|
||||
public partial class LlmService : ILlmService
|
||||
{
|
||||
private readonly HttpClient _http;
|
||||
private readonly HttpClient _httpInsecure;
|
||||
@@ -148,7 +148,7 @@ public partial class LlmService : IDisposable
|
||||
internal string GetActiveExecutionProfileKey()
|
||||
=> Agent.ModelExecutionProfileCatalog.Normalize(GetActiveRegisteredModel()?.ExecutionProfile);
|
||||
|
||||
internal Agent.ModelExecutionProfileCatalog.ExecutionPolicy GetActiveExecutionPolicy()
|
||||
public Agent.ModelExecutionProfileCatalog.ExecutionPolicy GetActiveExecutionPolicy()
|
||||
=> Agent.ModelExecutionProfileCatalog.Get(GetActiveExecutionProfileKey());
|
||||
|
||||
internal double ResolveToolTemperature()
|
||||
@@ -220,13 +220,6 @@ public partial class LlmService : IDisposable
|
||||
/// <summary>가장 최근 요청의 토큰 사용량. 스트리밍/비스트리밍 완료 후 갱신됩니다.</summary>
|
||||
public TokenUsage? LastTokenUsage { get; private set; }
|
||||
|
||||
public record RuntimeConnectionSnapshot(
|
||||
string Service,
|
||||
string Model,
|
||||
string Endpoint,
|
||||
bool AllowInsecureTls,
|
||||
bool HasApiKey);
|
||||
|
||||
public LlmService(SettingsService settings)
|
||||
{
|
||||
_settings = settings;
|
||||
@@ -342,8 +335,8 @@ public partial class LlmService : IDisposable
|
||||
{
|
||||
return llm.RegisteredModels.FirstOrDefault(m =>
|
||||
m.Service.Equals(service, StringComparison.OrdinalIgnoreCase) &&
|
||||
(CryptoService.DecryptIfEnabled(m.EncryptedModelName, llm.EncryptionEnabled) == modelName ||
|
||||
m.Alias == modelName));
|
||||
(string.Equals(CryptoService.DecryptIfEnabled(m.EncryptedModelName, llm.EncryptionEnabled), modelName, StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(m.Alias, modelName, StringComparison.OrdinalIgnoreCase)));
|
||||
}
|
||||
|
||||
private Models.RegisteredModel? GetActiveRegisteredModel()
|
||||
@@ -572,7 +565,7 @@ public partial class LlmService : IDisposable
|
||||
EnsureOperationModeAllowsLlmService(activeService);
|
||||
try
|
||||
{
|
||||
return await SendWithServiceAsync(activeService, messages, ct);
|
||||
return await SendWithServiceAsync(activeService, messages, ct).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex) when (llm.FallbackModels.Count > 0)
|
||||
{
|
||||
@@ -587,7 +580,7 @@ public partial class LlmService : IDisposable
|
||||
EnsureOperationModeAllowsLlmService(fbService);
|
||||
LogService.Warn($"모델 폴백: {activeService} → {fbService} ({ex.Message})");
|
||||
LastFallbackInfo = $"{activeService} → {fbService}";
|
||||
return await SendWithServiceAsync(fbService, messages, ct);
|
||||
return await SendWithServiceAsync(fbService, messages, ct).ConfigureAwait(false);
|
||||
}
|
||||
catch { continue; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user