perf(agent-runner): improve session registry and orchestrator efficiency

- Add pre-computed _authorized_ids (frozenset) at session registration for O(1) lookup
- Refactor is_resource_allowed() from linear search to set membership check
- Add thread-safe locking to get_session_registry() singleton
- Cache _session_registry and _state_store references in orchestrator __init__
- Add asyncio.gather() for parallel resource building in AgentResourceBuilder
- Create shared test fixtures in tests/unit_tests/agent/conftest.py
- Update test files to import from shared conftest.py

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
huanghuoguoguo
2026-05-11 21:45:26 +08:00
parent d6b8f48e73
commit dc82fb584a
23 changed files with 4438 additions and 677 deletions

View File

@@ -218,6 +218,7 @@ export default function PipelineFormComponent({
.getPipeline(pipelineId || '')
.then((resp: GetPipelineResponseData) => {
setIsDefaultPipeline(resp.pipeline.is_default ?? false);
const loadedValues = {
basic: {
name: resp.pipeline.name,
@@ -348,8 +349,10 @@ export default function PipelineFormComponent({
) {
// Special handling for AI config section
if (formName === 'ai') {
// Get the currently selected runner
const currentRunner = form.watch('ai.runner.runner');
// Get the currently selected runner (use 'id' for new format, fallback to 'runner' for old)
const runnerConfig = (form.watch('ai.runner') as any) || {};
const currentRunner = runnerConfig.id || runnerConfig.runner;
// If this is the runner selector stage, render it directly
if (stage.name === 'runner') {
@@ -385,8 +388,8 @@ export default function PipelineFormComponent({
return null;
}
// For n8n-service-api config, use N8nAuthFormComponent for form linkage
if (stage.name === 'n8n-service-api') {
// For n8n runner config, use N8nAuthFormComponent for form linkage
if (stage.name === 'n8n-service-api' || stage.name === 'plugin:langbot/n8n-agent/default') {
return (
<Card key={stage.name}>
<CardHeader>
@@ -413,6 +416,48 @@ export default function PipelineFormComponent({
</Card>
);
}
// For plugin runner configs, store in ai.runner_config[runnerId]
const isPluginRunner =
currentRunner && currentRunner.startsWith('plugin:');
if (isPluginRunner) {
const runnerConfigs = (form.watch('ai.runner_config') as any) || {};
return (
<Card key={stage.name}>
<CardHeader>
<CardTitle>{extractI18nObject(stage.label)}</CardTitle>
{stage.description && (
<CardDescription>
{extractI18nObject(stage.description)}
</CardDescription>
)}
</CardHeader>
<CardContent className="space-y-6">
<DynamicFormComponent
itemConfigList={stage.config}
initialValues={runnerConfigs[stage.name] || {}}
onSubmit={(values) => {
// Store in ai.runner_config[stage.name]
const currentRunnerConfigs =
(form.getValues('ai.runner_config') as any) || {};
form.setValue('ai.runner_config', {
...currentRunnerConfigs,
[stage.name]: values,
});
// Mark as initialized
const stageKey = `ai.runner_config.${stage.name}`;
if (!initializedStagesRef.current.has(stageKey)) {
initializedStagesRef.current.add(stageKey);
savedSnapshotRef.current = JSON.stringify(form.getValues());
}
}}
/>
</CardContent>
</Card>
);
}
}
// Box availability is exposed through ``systemContext.__system.box_available``