Skip to content

Commit 4dca502

Browse files
committed
feat(config): parse model token limits from ACL
1 parent 6f93640 commit 4dca502

2 files changed

Lines changed: 83 additions & 0 deletions

File tree

core/src/config/loader.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ fn acl_usize_attr(block: &a3s_acl::Block, keys: &[&str]) -> Option<usize> {
5252
}
5353
}
5454

55+
fn acl_u32_attr(block: &a3s_acl::Block, keys: &[&str]) -> Option<u32> {
56+
acl_usize_attr(block, keys).map(|value| value.min(u32::MAX as usize) as u32)
57+
}
58+
5559
fn acl_path_list_attr(block: &a3s_acl::Block, keys: &[&str]) -> Option<Vec<PathBuf>> {
5660
let value = acl_attr(block, keys)?;
5761
match value {
@@ -276,10 +280,55 @@ impl CodeConfig {
276280
model.release_date = Some(release_date);
277281
}
278282
}
283+
"maxTokens" | "max_tokens" | "outputTokens"
284+
| "output_tokens" => {
285+
if let Some(output) = acl_u32_attr(
286+
model_block,
287+
&[
288+
"maxTokens",
289+
"max_tokens",
290+
"outputTokens",
291+
"output_tokens",
292+
],
293+
) {
294+
model.limit.output = output;
295+
}
296+
}
297+
"contextTokens" | "context_tokens" | "maxContextTokens"
298+
| "max_context_tokens" => {
299+
if let Some(context) = acl_u32_attr(
300+
model_block,
301+
&[
302+
"contextTokens",
303+
"context_tokens",
304+
"maxContextTokens",
305+
"max_context_tokens",
306+
],
307+
) {
308+
model.limit.context = context;
309+
}
310+
}
279311
_ => {}
280312
}
281313
}
282314

315+
for limit_block in &model_block.blocks {
316+
if limit_block.name == "limit" {
317+
if let Some(output) = acl_u32_attr(
318+
limit_block,
319+
&["output", "max_tokens", "output_tokens"],
320+
) {
321+
model.limit.output = output;
322+
}
323+
if let Some(context) = acl_u32_attr(
324+
limit_block,
325+
&["context", "context_tokens", "max_context_tokens"],
326+
) {
327+
model.limit.context = context;
328+
}
329+
}
330+
}
331+
283332
provider.models.push(model);
284333
}
285334
}

core/src/config/tests.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,40 @@ fn test_config_supports_acl_style_provider_labels() {
111111
assert!(config.providers[0].models[0].tool_call);
112112
}
113113

114+
#[test]
115+
fn test_config_parses_acl_model_token_limits() {
116+
let config = CodeConfig::from_acl(
117+
r#"
118+
default_model = "openai/glm-5.1"
119+
120+
providers "openai" {
121+
api_key = "sk-test"
122+
base_url = "http://127.0.0.1:18051/v1"
123+
124+
models "glm-5.1" {
125+
name = "GLM 5.1"
126+
max_tokens = 4096
127+
context_tokens = 32768
128+
}
129+
130+
models "camel-aliases" {
131+
outputTokens = 8192
132+
maxContextTokens = 65536
133+
}
134+
}
135+
"#,
136+
)
137+
.unwrap();
138+
139+
let flat = &config.providers[0].models[0].limit;
140+
assert_eq!(flat.output, 4096);
141+
assert_eq!(flat.context, 32768);
142+
143+
let aliases = &config.providers[0].models[1].limit;
144+
assert_eq!(aliases.output, 8192);
145+
assert_eq!(aliases.context, 65536);
146+
}
147+
114148
#[test]
115149
fn test_config_builder() {
116150
let config = CodeConfig::new()

0 commit comments

Comments
 (0)