Appearance
Solution SDK
一句话:用户只需在
main.py里定义题面要求的顶层函数;Solution 容器内的 Solution Host 会自动注册这些函数,等 Evaluator 按名调用,并在需要时用call_capability反向请求受限能力。
Solution SDK 运行在 Solution 容器中。用户主要通过定义函数供 evaluator 调用;Solution Host 会自动加载用户模块并注册其中的顶层函数。协议线格式见 RPC 与可传递数据。
暴露函数
题面会声明必须实现的函数。例如:
python
def solve(a: int, b: int) -> int:
return a + bEvaluator 会通过函数名调用该函数。函数名、参数数量和返回值语义由题目定义。
用户代码由 Judge Worker 以硬编码名 main.py 注入容器,Solution Host 通过 --entry /workspace/main.py 加载,模块名固定为 user_solution。出题人无需、也不能配置入口文件名。
顶层代码
Solution Host 会导入用户的 main.py。因此顶层代码会在加载模块时执行。
只在顶层定义函数与常量
建议用户避免在顶层执行耗时逻辑、读写外部资源或提前输出大量内容——它们发生在任何 runner.call() 之前,会拖慢或干扰评测。
stdout 和 stderr
用户代码中的 print() 不是答案输出。当前实现中,普通 print() 会写到 Solution 的 stdout,由于 stdout 是 NDJSON 协议通道,这些非协议文本会被 Judge Worker 丢弃,不会作为评测输出展示。因此不要把调试信息依赖在 print() 上。
下面的提交不会被当作 A+B 的正确答案:
python
print(3)A+B 题需要实现函数:
python
def solve(input_str: str) -> str:
a, b = map(int, input_str.split())
return str(a + b)常见错误语义
调用失败时,Solution Host 返回错误帧,Evaluator 侧收到对应异常:
| 情况 | 协议 code | Evaluator 侧异常 |
|---|---|---|
| 函数不存在 | NotFound | NotFoundError |
| 用户函数抛异常 | Exception(含清洗后 traceback) | SystemError |
| 返回值类型非法 | Rejected | RejectedError |
用户函数的参数和返回值会经过 Neuro OJ codec 编码。支持的类型包括 None、布尔值、整数、有限浮点数、字符串、字节串、列表和字符串键字典(不支持 tuple/set)。更多限制见 RPC 与可传递数据。
noj_solution_sdk
当题目声明了 capability(如外部网络 API)时,可以在注册函数内调用:
python
from noj_solution_sdk import call_capability
def solve(prompt: str) -> str:
return call_capability("request_llm_completion", prompt)call_capability(name, *args) 把请求经 judge 转发到 Evaluator 执行,返回解码后的结果。能力名称、参数与返回值语义由题面声明。
- RPC 方向:Evaluator 主动调用 Solution(
runner.call());Solution 通过call_capability反向调用 Evaluator 注册的能力(如网络请求)。Solution 不能读取 evaluator 的文件或隐藏用例数据。 - 类型约束:
call_capability的参数与返回值与runner.call()相同:只允许None / bool / int / float / str / bytes / list / dict,不可序列化的对象会被拒绝。 - 错误:未注册的 capability 抛
CapabilityNotFoundError;参数/返回值类型非法抛CapabilityRejectedError;handler 异常抛CapabilityError(含code与清洗后 trace);通道断开抛CapabilityConnectionError。 - 安全:Solution 容器始终无网;capability 由出题人显式注册并负责参数校验(见 如何提供受限网络能力)。
普通不需要网络的题目无需导入该 SDK。