in src/Core/Compiling/Policy/TokenLimitCompiler.cs [14:97]
public class LlmTokenLimitCompiler()
: BaseTokenLimitCompiler("llm-token-limit", nameof(IInboundContext.LlmTokenLimit));
public class AzureOpenAiTokenLimitCompiler()
: BaseTokenLimitCompiler("azure-openai-token-limit", nameof(IInboundContext.AzureOpenAiTokenLimit));
public abstract class BaseTokenLimitCompiler : IMethodPolicyHandler
{
private readonly string _policyName;
protected BaseTokenLimitCompiler(string policyName, string methodName)
{
_policyName = policyName;
MethodName = methodName;
}
public string MethodName { get; }
public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
{
if (!node.TryExtractingConfigParameter<TokenLimitConfig>(context, _policyName, out var values))
{
return;
}
var element = new XElement(_policyName);
// Add required attributes
if (!element.AddAttribute(values, nameof(TokenLimitConfig.CounterKey), "counter-key"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
_policyName,
nameof(TokenLimitConfig.CounterKey)
));
return;
}
if (!element.AddAttribute(values, nameof(TokenLimitConfig.EstimatePromptToken), "estimate-prompt-token"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
_policyName,
nameof(TokenLimitConfig.EstimatePromptToken)
));
return;
}
var tokensPerMinuteAdded =
element.AddAttribute(values, nameof(TokenLimitConfig.TokensPerMinute), "tokens-per-minute");
var quotaAdded = element.AddAttribute(values, nameof(TokenLimitConfig.TokenQuota), "token-quota");
if (tokensPerMinuteAdded == quotaAdded)
{
context.Report(Diagnostic.Create(
CompilationErrors.OnlyOneOfTwoShouldBeDefined,
node.GetLocation(),
"llm-token-limit",
nameof(TokenLimitConfig.TokensPerMinute),
nameof(TokenLimitConfig.TokenQuota)
));
return;
}
element.AddAttribute(values, nameof(TokenLimitConfig.TokenQuotaPeriod), "token-quota-period");
element.AddAttribute(values, nameof(TokenLimitConfig.RetryAfterHeaderName), "retry-after-header-name");
element.AddAttribute(values, nameof(TokenLimitConfig.RetryAfterVariableName), "retry-after-variable-name");
element.AddAttribute(values, nameof(TokenLimitConfig.RemainingQuotaTokensHeaderName),
"remaining-quota-tokens-header-name");
element.AddAttribute(values, nameof(TokenLimitConfig.RemainingQuotaTokensVariableName),
"remaining-quota-tokens-variable-name");
element.AddAttribute(values, nameof(TokenLimitConfig.RemainingTokensHeaderName),
"remaining-tokens-header-name");
element.AddAttribute(values, nameof(TokenLimitConfig.RemainingTokensVariableName),
"remaining-tokens-variable-name");
element.AddAttribute(values, nameof(TokenLimitConfig.TokensConsumedHeaderName), "tokens-consumed-header-name");
element.AddAttribute(values, nameof(TokenLimitConfig.TokensConsumedVariableName),
"tokens-consumed-variable-name");
context.AddPolicy(element);
}
}