본문으로 건너뛰기

하네스 인증

노트북에서는 이미 grok login, claude login 또는 codex login을 실행했습니다. GitHub 러너에는 브라우저 로그인이 없고 API 키만 있습니다. 두 환경 모두 localProcessSandbox()를 사용할 수 있습니다.

어댑터에서 authMode를 설정합니다. 샌드박스 유형이 자격 증명을 선택하지는 않습니다. 기본값은 'api-key'입니다. 대부분의 하네스는 Docker 또는 클라우드 샌드박스에서 실행됩니다. 이 환경에는 호스트 CLI 로그인이 없습니다.

  • 'api-key' (기본값): 키를 주입해 사용합니다.
  • 'host': 머신의 CLI 로그인을 사용합니다. 해당 프로세스에 API 키를 주입하지 않습니다.

다음 두 위치 중 하나에 authMode를 전달합니다.

  • 어댑터 팩토리: grokBuildText('composer-2.5', { authMode: 'host' })
  • 단일 호출: chat({ modelOptions: { authMode: 'host' } })

호스트 로그인

머신에서 이미 grok login, claude login 또는 codex login을 실행한 경우 사용합니다.

import { chat } from '@tanstack/ai'
import { grokBuildText } from '@tanstack/ai-grok-build'
import { defineSandbox, defineWorkspace, withSandbox } from '@tanstack/ai-sandbox'
import { localProcessSandbox } from '@tanstack/ai-sandbox-local-process'
import { messages, threadId } from './chat-context'

const sandbox = defineSandbox({
id: 'repo-agent',
provider: localProcessSandbox({
scrubEnv: ['XAI_API_KEY', 'GROK_API_KEY'],
}),
workspace: defineWorkspace({
source: { type: 'local', path: '/abs/path/to/repo' },
}),
})

const stream = chat({
threadId,
adapter: grokBuildText('composer-2.5', { authMode: 'host' }),
messages,
middleware: [withSandbox(sandbox)],
})

scrubEnv는 호스트 프로세스가 상속한 키를 제거합니다. CLI가 XAI_API_KEY를 확인하면 로그인보다 해당 키를 우선 사용할 수 있습니다.

API 키

이 방식이 기본값입니다. 러너, Docker 또는 CLI 로그인이 없는 머신에서 사용합니다. authMode는 생략할 수 있습니다.

import { chat } from '@tanstack/ai'
import { grokBuildText } from '@tanstack/ai-grok-build'
import {
createSecrets,
defineSandbox,
defineWorkspace,
githubRepo,
withSandbox,
} from '@tanstack/ai-sandbox'
import { dockerSandbox } from '@tanstack/ai-sandbox-docker'
import { messages, threadId } from './chat-context'

const sandbox = defineSandbox({
id: 'repo-agent',
provider: dockerSandbox({ image: 'node:22' }),
workspace: defineWorkspace({
source: githubRepo({ repo: 'owner/app' }),
secrets: createSecrets({
XAI_API_KEY: process.env.XAI_API_KEY ?? '',
}),
}),
})

const stream = chat({
threadId,
adapter: grokBuildText('composer-2.5'),
messages,
middleware: [withSandbox(sandbox)],
})

각 하네스

어댑터authMode: 'api-key' (기본값)authMode: 'host'
Grok BuildXAI_API_KEYgrok login
Claude CodeANTHROPIC_API_KEYclaude login
CodexCODEX_API_KEYcodex login
ACP-CompatibleauthMethodId 설정 (Grok의 경우 xai.api_key)ACP authenticate 건너뛰기

OpenCode는 여전히 프로세스 env에서 OPENAI_API_KEY를 읽습니다. authMode 플래그는 없습니다.

클라이언트 및 서버

React 채팅 예제는 /repo-report에서 동일한 선택 항목을 제공합니다. 클라이언트는 authMode를 전송하고, 서버는 해당 값으로 어댑터를 생성합니다.

클라이언트:

import { fetchServerSentEvents, useChat } from '@tanstack/ai-react'

function Report() {
const { sendMessage } = useChat({
connection: fetchServerSentEvents('/api/sandbox-repo-report'),
forwardedProps: { authMode: 'api-key' },
})

return (
<button type="button" onClick={() => sendMessage('Report on this repo')}>
Run
</button>
)
}

서버:

import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { grokBuildText } from '@tanstack/ai-grok-build'
import { withSandbox } from '@tanstack/ai-sandbox'
import { sandbox } from './sandbox'

export async function POST(request: Request) {
const body: unknown = await request.json()
const forwarded =
typeof body === 'object' &&
body !== null &&
'forwardedProps' in body &&
typeof body.forwardedProps === 'object' &&
body.forwardedProps !== null
? body.forwardedProps
: {}
const authMode =
'authMode' in forwarded && forwarded.authMode === 'host'
? 'host'
: 'api-key'

const stream = chat({
adapter: grokBuildText('composer-2.5', { authMode }),
messages: [{ role: 'user', content: 'Report on this repo' }],
stream: true,
middleware: [withSandbox(sandbox)],
})

return toServerSentEventsResponse(stream)
}

하네스에서 선택할 어댑터를 확인하고, 프로바이더에서 local-process의 scrubEnv를 확인합니다.