Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - utkuvibing/relay · GitHub
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Relay

Local-first orchestration for AI models, coding agents, tools, and people.

Relay runs configured agents, keeps run and task state in SQLite, and puts verification and approval outside the model's response. It is a runtime, not another model provider.

What works today

CapabilityStatusDetails
Single-agent API runsAvailablerelay ask runs one configured API or harness agent and persists its input and output.
Codex OAuthAvailableThe codex harness uses the Codex CLI's own account authentication.
DeepSeek BYOKAvailableThe deepseek agent uses DeepSeek's OpenAI-compatible Chat Completions API.
Task executionAvailablerelay build drives a task through evidence-gated context, plan, implementation, verification, review, and approval steps.
Run and task inspectionAvailablerelay status, relay history, and relay inspect read the local ledger.
Conversation bus coreIn progressP4.1 adds typed, addressed, append-only messages and a Room-feed read model.
Automatic agent-to-agent deliveryNot yetP4.2 through P4.4 still need routing, reply pairing, and the bounded multi-agent driver.
relay discuss and persistent RoomsPlannedThese belong to P5 and P7. The commands are not implemented yet.

The important boundary is simple: calling two agents separately does not make them talk. Each call is its own run. Relay will coordinate model-to-model messages through the P4 bus and P5 discussion protocols once those phases land.

Quick start

Relay requires Python 3.11+ and uv.

uv sync --extra dev
uv run relay init
uv run relay status

The checked-in relay.yaml contains the project agents. relay init creates the local .relay/ profile and SQLite database without overwriting an existing configuration.

Run Codex with OAuth

Authenticate the Codex CLI once with its own account flow, then run it through Relay:

codex login
uv run relay ask codex "Reply with exactly: RELAY_OAUTH_OK"

Relay does not read or store the Codex subscription session. The harness owns that authentication.

Run DeepSeek with BYOK

DeepSeek uses the same wire format as the OpenAI Chat Completions API. The provider is still DeepSeek. No OpenAI account or OpenAI key is involved.

Create or edit the local, gitignored .env file:

DEEPSEEK_API_KEY=your-key-hereRELAY_API_KEY_ENV=DEEPSEEK_API_KEY

Then load that file explicitly when invoking Relay:

uv run --env-file .env relay status
uv run --env-file .env relay ask deepseek "Reply with exactly: DEEPSEEK_OK"

The project configuration keeps provider facts only:

agents:
deepseek:
backend: apiadapter: openai_compatiblemodel: deepseek-v4-flashbase_url: https://api.deepseek.com

The adapter appends /chat/completions to base_url and sends the key as a Bearer token. The key stays in the environment and never enters relay.yaml, source code, or Relay history. See the official DeepSeek API documentation for the current request format and model list.

How a run is recorded

relay ask follows one agent from request to result:

CLI command
-> configured agent
-> API adapter or harness adapter
-> SQLite run, artifacts, and lifecycle events

Relay writes the prompt as a run_input artifact before the provider call. A successful response becomes a run_output artifact. Failures are persisted as sanitized run errors.

relay build adds a task state machine around harness execution. The model can report that it is done, but Relay only advances the task when the required evidence, verification, review, and human approval records exist.

Agents and adapters

The adapter name selects an execution implementation. The logical name under agents: selects the configured agent you use from the CLI.

Execution familyImplemented adaptersAuthentication
APIopenai, openai_compatible, gptEnvironment-provided key
Harnesscodex_cli, claude_code, antigravity_cliThe harness owns its login or session

This separation lets an API agent such as DeepSeek and a harness agent such as Codex share Relay's run and task records without pretending they use the same transport or billing model.

Roadmap

Statuses describe the repository, not a promised release date.

PhaseScopeStatus
P0Specification freeze and core contractsDone
P1Single-agent runtime, API adapter, SQLite persistenceDone
P2Generic harness runtime, process isolation, Codex/Claude/Antigravity adaptersIn progress
P3Deterministic task state machine, verification, review, approval, and observabilityDone
P4Multi-agent messaging and heterogeneous deliveryIn progress: P4.1 bus core done; P4.2-P4.4 remain
P5Bounded discussion protocols, communication policy, and budgetsPlanned
P6Automated implementation review and fix loopPlanned
P7Persistent Rooms and long-lived participant contextPlanned
P8Decision provenancePlanned
P9Relay serverPlanned
P10MCP and chat interface integrationPlanned
P11Adapter ecosystem and certificationPlanned
P12TUIPlanned

What P4 means

P4 is split into four concrete slices:

  1. P4.1, the conversation bus core: typed and addressed messages, append-only storage, and a deterministic Room-feed read model.
  2. P4.2, role and logical-agent resolution plus Relay-mediated delivery.
  3. P4.3, reply pairing, blocking replies, and bounded round trips.
  4. P4.4, a bounded multi-agent driver with API-to-harness-to-harness coverage.

P4.1 gives Relay somewhere safe to store conversation traffic. It does not yet dispatch a prompt to two models or feed one model's answer to another. P5 adds the rules that decide who may speak to whom, for what purpose, and how many rounds are allowed. P7 turns that machinery into a persistent group-chat experience.

Development

Install the development dependencies and run the test suite:

uv sync --extra dev
uv run pytest
uv run ruff check relay tests

The full specification and design decisions live in docs/SPEC.md. P4.1 implementation notes are in docs/plans/p4.1-conversation-bus-core-plan.md.

Project layout

relay/
agents/ API and harness adapters
cli/ Typer commands and terminal rendering
context/ Configuration and workspace discovery
core/ Orchestration, state machine, and conversation bus
harness/ Process runtime, grants, and sanitization
storage/ SQLite schema, models, events, and stores
tests/ Unit, integration, conformance, and persistence tests
docs/ Specification, roadmap amendments, and research notes

Security rules

  • Keep API keys in environment variables or an ignored local .env file.
  • Keep relay.yaml limited to non-secret provider facts.
  • Let harnesses own their subscription authentication.
  • Treat model claims as evidence candidates. Relay's state machine and permission gates make the actual transition decisions.

License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages