Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions codex-cli/scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@
## Codex Infinity local publish

To publish a new `@codex-infinity/codex-infinity` package with the current Rust
binary:
binaries:

```bash
cd codex-cli
npm run deploy
```

This builds `codex-rs`, copies `target/release/codex` into
`codex-cli/vendor/x86_64-unknown-linux-gnu/codex/codex`, bumps the package patch
This builds `codex-rs`, copies `target/release/codex` and
`target/release/codex-code-mode-host` into
`codex-cli/vendor/x86_64-unknown-linux-gnu/codex/`, bumps the package patch
version, verifies the Linux x64 vendor payload, and runs `npm publish --access
public`.

Expand Down
10 changes: 7 additions & 3 deletions codex-cli/scripts/deploy_new_binary.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ usage() {
cat <<'EOF'
Usage: scripts/deploy_new_binary.sh [--dry-run] [--bump] [--no-bump] [--tag <tag>]

Builds the Rust CLI, installs the new Linux x64 binary into vendor/, verifies
the npm package payload, and publishes @codex-infinity/codex-infinity.
Builds the Rust CLI and code-mode host, installs the new Linux x64 binaries
into vendor/, verifies the npm package payload, and publishes
@codex-infinity/codex-infinity.

By default the script bumps the package patch version before publishing because
npm package versions are immutable. Dry-runs restore package.json after the
Expand Down Expand Up @@ -62,6 +63,7 @@ codex_cli_root="$(cd "$script_dir/.." && pwd)"
repo_root="$(cd "$codex_cli_root/.." && pwd)"
codex_rs_root="$repo_root/codex-rs"
binary_dest="$codex_cli_root/vendor/x86_64-unknown-linux-gnu/codex/codex"
code_mode_host_dest="$codex_cli_root/vendor/x86_64-unknown-linux-gnu/codex/codex-code-mode-host"

if ! command -v "${CC:-cc}" >/dev/null 2>&1; then
if command -v gcc >/dev/null 2>&1; then
Expand All @@ -81,12 +83,14 @@ if ((!dry_run)); then
fi

cd "$codex_rs_root"
cargo build --release -p codex-cli
cargo build --release -p codex-cli -p codex-code-mode-host
target_dir="$(cargo metadata --format-version 1 --no-deps | python3 -c "import json, sys; print(json.load(sys.stdin)['target_directory'])")"
binary_src="$target_dir/release/codex"
code_mode_host_src="$target_dir/release/codex-code-mode-host"

mkdir -p "$(dirname "$binary_dest")"
install -m 755 "$binary_src" "$binary_dest"
install -m 755 "$code_mode_host_src" "$code_mode_host_dest"

cd "$codex_cli_root"

Expand Down
13 changes: 13 additions & 0 deletions codex-cli/scripts/verify_vendor.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,21 @@ const foundGroups = new Set();
for (const [group, triples] of Object.entries(platformGroups)) {
for (const triple of triples) {
const binaryName = triple.includes('windows') ? 'codex.exe' : 'codex';
const codeModeHostName = triple.includes('windows')
? 'codex-code-mode-host.exe'
: 'codex-code-mode-host';
const binaryPath = join(vendorRoot, triple, 'codex', binaryName);
const codeModeHostPath = join(
vendorRoot,
triple,
'codex',
codeModeHostName,
);
if (existsSync(binaryPath)) {
if (!existsSync(codeModeHostPath)) {
console.warn(`Missing code mode host for ${triple}`);
continue;
}
console.log(`Found binary for ${triple}`);
foundAny = true;
foundGroups.add(group);
Expand Down
67 changes: 67 additions & 0 deletions codex-rs/codex-api/src/endpoint/chat.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
use crate::auth::SharedAuthProvider;
use crate::common::ResponseStream;
use crate::endpoint::session::EndpointSession;
use crate::error::ApiError;
use crate::provider::Provider;
use crate::requests::ChatRequest;
use crate::sse::chat::spawn_chat_stream;
use crate::telemetry::SseTelemetry;
use codex_client::EncodedJsonBody;
use codex_client::HttpTransport;
use codex_client::RequestCompression;
use codex_client::RequestTelemetry;
use http::HeaderValue;
use http::Method;
use std::sync::Arc;

pub struct ChatClient<T: HttpTransport> {
session: EndpointSession<T>,
sse_telemetry: Option<Arc<dyn SseTelemetry>>,
}

impl<T: HttpTransport> ChatClient<T> {
pub fn new(transport: T, provider: Provider, auth: SharedAuthProvider) -> Self {
Self {
session: EndpointSession::new(transport, provider, auth),
sse_telemetry: None,
}
}

pub fn with_telemetry(
self,
request: Option<Arc<dyn RequestTelemetry>>,
sse: Option<Arc<dyn SseTelemetry>>,
) -> Self {
Self {
session: self.session.with_request_telemetry(request),
sse_telemetry: sse,
}
}

pub async fn stream_request(&self, request: ChatRequest) -> Result<ResponseStream, ApiError> {
let body = EncodedJsonBody::encode(&request.body)
.map_err(|e| ApiError::Stream(format!("failed to encode chat request: {e}")))?;
let stream_response = self
.session
.stream_encoded_json_with(
Method::POST,
"chat/completions",
request.headers,
Some(body),
|req| {
req.headers.insert(
http::header::ACCEPT,
HeaderValue::from_static("text/event-stream"),
);
req.compression = RequestCompression::None;
},
)
.await?;
Ok(spawn_chat_stream(
stream_response,
self.session.provider().stream_idle_timeout,
self.sse_telemetry.clone(),
None,
))
}
}
2 changes: 2 additions & 0 deletions codex-rs/codex-api/src/endpoint/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub(crate) mod chat;
pub(crate) mod compact;
pub(crate) mod images;
pub(crate) mod memories;
Expand All @@ -9,6 +10,7 @@ pub(crate) mod responses_websocket;
pub(crate) mod search;
mod session;

pub use chat::ChatClient;
pub use compact::CompactClient;
pub use images::ImagesClient;
pub use memories::MemoriesClient;
Expand Down
3 changes: 3 additions & 0 deletions codex-rs/codex-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ pub use crate::common::WS_REQUEST_HEADER_TRACEPARENT_CLIENT_METADATA_KEY;
pub use crate::common::WS_REQUEST_HEADER_TRACESTATE_CLIENT_METADATA_KEY;
pub use crate::common::create_text_param_for_request;
pub use crate::common::response_create_client_metadata;
pub use crate::endpoint::ChatClient;
pub use crate::endpoint::CompactClient;
pub use crate::endpoint::ImagesClient;
pub use crate::endpoint::MemoriesClient;
Expand Down Expand Up @@ -83,6 +84,8 @@ pub use crate::images::ImageUrl;
pub use crate::provider::Provider;
pub use crate::provider::RetryConfig;
pub use crate::provider::is_azure_responses_provider;
pub use crate::requests::ChatRequest;
pub use crate::requests::ChatRequestBuilder;
pub use crate::requests::Compression;
pub use crate::search::AllowedCaller;
pub use crate::search::ApproximateLocation;
Expand Down
Loading
Loading