feat(prompt): expand wildcards at runtime (#895)

This commit is contained in:
Will Miao
2026-04-15 20:42:27 +08:00
parent 6d0d9600a7
commit 62247bdd87
15 changed files with 831 additions and 31 deletions

View File

@@ -2489,6 +2489,30 @@ class CustomWordsHandler:
return None
class WildcardsHandler:
"""Handler for wildcard autocomplete search."""
def __init__(self, *, service=None) -> None:
if service is None:
from ...services.wildcard_service import get_wildcard_service
service = get_wildcard_service()
self._service = service
async def search_wildcards(self, request: web.Request) -> web.Response:
"""Search managed wildcard keys for autocomplete."""
try:
search_term = request.query.get("search", "")
limit = min(int(request.query.get("limit", "20")), 100)
offset = max(0, int(request.query.get("offset", "0")))
results = self._service.search_keys(search_term, limit=limit, offset=offset)
return web.json_response({"success": True, "words": results})
except Exception as exc:
logger.error("Error searching wildcards: %s", exc, exc_info=True)
return web.json_response({"error": str(exc)}, status=500)
class NodeRegistryHandler:
def __init__(
self,
@@ -2717,6 +2741,7 @@ class MiscHandlerSet:
backup: BackupHandler,
filesystem: FileSystemHandler,
custom_words: CustomWordsHandler,
wildcards: WildcardsHandler,
supporters: SupportersHandler,
doctor: DoctorHandler,
example_workflows: ExampleWorkflowsHandler,
@@ -2734,6 +2759,7 @@ class MiscHandlerSet:
self.backup = backup
self.filesystem = filesystem
self.custom_words = custom_words
self.wildcards = wildcards
self.supporters = supporters
self.doctor = doctor
self.example_workflows = example_workflows
@@ -2775,6 +2801,7 @@ class MiscHandlerSet:
"open_settings_location": self.filesystem.open_settings_location,
"open_backup_location": self.filesystem.open_backup_location,
"search_custom_words": self.custom_words.search_custom_words,
"search_wildcards": self.wildcards.search_wildcards,
"get_supporters": self.supporters.get_supporters,
"get_example_workflows": self.example_workflows.get_example_workflows,
"get_example_workflow": self.example_workflows.get_example_workflow,

View File

@@ -30,6 +30,7 @@ MISC_ROUTE_DEFINITIONS: tuple[RouteDefinition, ...] = (
RouteDefinition("POST", "/api/lm/settings/libraries/activate", "activate_library"),
RouteDefinition("GET", "/api/lm/health-check", "health_check"),
RouteDefinition("GET", "/api/lm/supporters", "get_supporters"),
RouteDefinition("GET", "/api/lm/wildcards/search", "search_wildcards"),
RouteDefinition("POST", "/api/lm/open-file-location", "open_file_location"),
RouteDefinition("POST", "/api/lm/update-usage-stats", "update_usage_stats"),
RouteDefinition("GET", "/api/lm/get-usage-stats", "get_usage_stats"),

View File

@@ -35,6 +35,7 @@ from .handlers.misc_handlers import (
SupportersHandler,
TrainedWordsHandler,
UsageStatsHandler,
WildcardsHandler,
build_service_registry_adapter,
)
from .handlers.base_model_handlers import BaseModelHandlerSet
@@ -130,6 +131,7 @@ class MiscRoutes:
metadata_provider_factory=self._metadata_provider_factory,
)
custom_words = CustomWordsHandler()
wildcards = WildcardsHandler()
supporters = SupportersHandler()
doctor = DoctorHandler(settings_service=self._settings)
example_workflows = ExampleWorkflowsHandler()
@@ -148,6 +150,7 @@ class MiscRoutes:
backup=backup,
filesystem=filesystem,
custom_words=custom_words,
wildcards=wildcards,
supporters=supporters,
doctor=doctor,
example_workflows=example_workflows,