본문으로 건너뛰기

Codemode

Codemode는 모델이 JavaScript 프로그램으로 도구 호출을 결합하고 프로그램용 결과를 살펴 간결한 답을 출력하게 합니다. 현재 세션의 호출 가능 도구와 접근 범위를 사용합니다. Node.js, 직접 파일 시스템 접근, 네트워크 전역, 타이머는 제공하지 않으며 적격 호스트 도구가 필요합니다.

활성화와 모드 선택​

Dashboard → Tools → Built-in → codemode에서 프로필 기본값을 설정하거나 대기 입력 없는 유휴 세션에 Codemode만 변경하세요. 프로필 Save는 기존 세션을 다시 선택하지 않습니다. Dashboard 설정을 참조하세요.

새 세션 또는 유휴 재개 세션의 도구 선택에 포함할 수 있습니다.

anyy --tools '+codemode,+tool_search'
anyy --resume SESSION_ID --tools '+codemode,+tool_search'

+ 규칙은 재개 세션 활성 목록이 아니라 프로필 기본 선택을 수정합니다. config.yaml에 기록하지 않습니다. 명시적 제외가 없으면 MCP 검색도 자동 활성화할 수 있습니다.

codemode.mode: on은 직접 도구를 함께 유지합니다. only는 스크립트 호출 가능한 직접 선언을 모델 요청에서 숨기지만 Codemode로 계속 호출할 수 있습니다. 모드는 활성화·추가 권한·역할 변경을 하지 않습니다. codemode.inline_budget은 선언에 포함할 중첩 도구 문서량을 제어합니다(기본 추정 약 3000토큰). 인라인 목록 밖 도구도 발견할 수 있습니다. Toolsets를 참조하세요.

스크립트 작성​

공개 인수는 필수 code 문자열을 가진 객체입니다.

{"code":"const result = await tools.bash({command: \"pwd\"}); text(result);"}

선택 네이티브 모델이 compat.supportsOpenAIGrammarTools를 선언하고 공급자가 경로를 지원하면 원시 JavaScript 문법 입력으로 보낼 수 있습니다. 나머지는 위 JSON 형식입니다. 둘 다 같은 표준 인수를 저장합니다.

스크립트는 async 함수 본문이므로 최상위 await·return이 작동합니다. Markdown 펜스 없이 소스를 주세요. read가 있을 때의 예:

const page = await tools.read({path: "README.md", offset: 1, limit: 60});
text(page);

시작한 호출은 모두 await해야 합니다. 종료 시 대기 호출은 취소됩니다. 호출마다 새 VM·전역을 만듭니다. 다른 호출까지 유지할 값은 store를 쓰세요.

선택 첫 줄로 출력·실행 제한을 설정합니다.

// @options: {"max_output_tokens": 2000, "timeout_ms": 30000}
const results = await Promise.all([
tools.bash({command: "git status --short"}),
tools.read({path: "README.md", limit: 40})
]);
for (const result of results) text(result);

이는 독립 읽기 두 개입니다. 의존 작업은 순서대로 실행하세요. timeout_ms는 최대 2147483647의 양수 정수이며 VM 로드·시작도 포함합니다. 생략하면 추가 스크립트 제한 시간은 없지만 상위 취소·호스트 도구 제한은 적용됩니다. max_output_tokens는 0 이상 정수, 기본 10000이며 대략적인 텍스트 예산입니다.

도구 검색과 호출​

MCP 이름을 추측하지 말고 검색 결과의 정확한 식별자를 사용하세요.

API동작
ALL_TOOLS현재 호출 가능한 이름·설명
await searchTools(query, {limit, namespace})스냅샷 검색. 기본 한도 8, 네임스페이스 선택 가능
await describeTool(name)선언 또는 undefined 반환. 표준 이름·스크립트 식별자 허용
await describeNamespace(name)네임스페이스 설명/지침·도구 식별자 또는 undefined
await tools.name({...})일반 호스트 경로로 기존 호출 가능 도구 호출

이름은 JavaScript 식별자로 정규화됩니다. 문장 부호는 _가 되며 충돌 시 실시간 선언이 기준입니다. 네임스페이스는 검색용 그룹이며 권한을 주지 않습니다. 숨김 도구·모델 전용 선언은 스크립트 호출 불가입니다.

searchTools는 기존 호출 가능 메타데이터만 검색합니다. 다른 서버 카탈로그를 가져오거나 후속 모델 선언을 활성화하지 않습니다. 별도 모델 tool_search가 활성화합니다.

중첩 호출 실패는 보통 reject합니다. 구조화 반환 선언 도구는 오류 객체로 resolve할 수도 있으니 모든 Promise 성공을 가정하지 말고 bash.exit_code, 제품 결과 상태, MCP isError를 확인하세요. 구조화 결과는 스크립트가 확인하고 원격 전체 응답 대신 유용한 부분만 text로 출력하세요.

출력과 분기별 값​

전역용도
text(value)텍스트 추가. 객체는 JSON 인코딩
image(dataURLOrBlock)base64 PNG/JPEG/GIF/WebP 추가 및 임시 이미지 파일 저장. 원격 URL 거부
console.log(...)콘솔 출력 블록에 진단 추가
return value반환값을 출력에 추가
exit()성공 종료
store(key, value) / load(key)문자열 키의 JSON 직렬화 가능 값 저장/읽기. undefined는 삭제

성공 저장 변경은 선택 대화 분기에 확정됩니다. 다른 분기는 자체 확정 값을 선택하고 DB 재열기 후에도 유지됩니다. 오류·취소·제한 시간은 현재 스크립트 준비 변경을 버립니다. 완료 도구 효과는 되돌리지 않습니다.

각 JSON 값 최대 262144자, 키와 직렬화 값 합계 최대 1048576자입니다. 전체 파일·자격 증명 대신 작은 상태를 저장하세요. VM 메모리는 256 MiB입니다. 강제 출력 한도는 JavaScript 문자 16777216개 또는 출력/콘솔 호출 100000회이며 초과하면 실패합니다.

실패 스크립트는 오류와 부분 출력을 반환할 수 있습니다. 텍스트 예산은 앞/뒤 발췌로 줄이고 임시 전체 출력 경로를 알려 줍니다. 파일이 있는 동안 read의 offset/limit로 읽으세요. 임시 경로는 영속 첨부 보장이 아닙니다. 저장 논리 결과 참조·예산은 도구 결과를 참조하세요.

분류기와 이미지 모델 API​

Codemode 안에서 다음 비동기 모델 API도 제공합니다. 도구 설명은 <ProfileHome>/system/docs/pi-v1.2.0/codemode.md의 번들 참조를 가리킵니다. 사용 전 전체 스키마를 읽으세요.

API인수
models.getModelsOfType(type, provider?)구성 모델 나열
models.getAvailableOfType(type, provider?)활성 공급자·로컬 해석 가능 자격 증명으로 필터. 원격 상태 점검 아님
models.getModelOfType(type, provider, id)별도 문자열 세 개로 조회. 알 수 없는 모델은 undefined
models.classify(model, context)구성 분류 모델 사용
models.generateImages(model, context)구성 이미지 모델 사용

유형은 chat, image, classifier입니다. chat 목록이 채팅 생성 함수를 노출하지 않습니다. 실행은 결합 provider/id 문자열이나 사용자 엔드포인트 대신 카탈로그 provider, id가 있는 모델 객체가 필요합니다.

분류의 context.state는 객체이며 선택 images는 base64 이미지 블록입니다. questions는 비어 있지 않은 객체입니다. 각 질문에는 instructions, type, criteria가 있습니다. choice는 라벨과 의미를 연결하고 score는 낮은 수준부터 나열하며 bool은 true·false의 문자열 의미를 줍니다.

const available = await models.getAvailableOfType("classifier");
if (!available.length) { text("No configured classifier is available"); exit(); }
const result = await models.classify(available[0], {
state: {subject: "Move tomorrow's meeting to Friday"},
questions: {
scheduling: {
type: "bool", instructions: "Does this request change a meeting?",
criteria: {true: "A meeting change is requested", false: "No meeting change"}
}
}
});
if (result.stopReason !== "stop") throw new Error(result.errorMessage || result.stopReason);
text(result);

생성에는 {input: [{type: "text", text: "..."}]}를 전달합니다. base64 이미지 블록으로 참조를 줄 수 있습니다. 예:

const available = await models.getAvailableOfType("image");
if (!available.length) { text("No configured image model is available"); exit(); }
const result = await models.generateImages(available[0], {
input: [{type: "text", text: "A simple blue bird icon on white"}]
});
if (result.stopReason !== "stop") throw new Error(result.errorMessage || result.stopReason);
for (const part of result.output) {
if (part.type === "image") image(part);
else if (part.type === "text") text(part.text);
}

스크립트 하나에서 분류/이미지 작업은 최대 네 개 동시 실행입니다. 공급자 실패는 stopReason: "error" 또는 "aborted"와 errorMessage로 반환합니다. 잘못된 인수는 공급자 호출 전에 reject할 수 있습니다. 모델 사용량은 Codemode 결과에 합산됩니다. 가용성, 요금, 허용 이미지 입력은 구성 공급자에 따릅니다.