Skip to content

Commit 771c6a6

Browse files
committed
codex_sdk: harden the final quality floor
Fix format, compile warnings, docs warnings, tests, dialyzer, and credo debt with durable code changes only.
1 parent 7d734a7 commit 771c6a6

12 files changed

Lines changed: 136 additions & 5 deletions

examples/conversation_and_resume.exs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,16 @@ case System.argv() do
9191
""")
9292

9393
_ ->
94-
Examples.Conversation.multi_turn()
94+
case ExamplesSupport.conversation_default_mode() do
95+
:multi_turn ->
96+
Examples.Conversation.multi_turn()
97+
98+
:save_resume ->
99+
IO.puts("""
100+
Ollama mode detected. Running the bounded save/resume path instead of the
101+
three-turn multi-turn demo for local OSS reliability.
102+
""")
103+
104+
Examples.Conversation.save_and_resume_demo()
105+
end
95106
end

examples/tool_bridging_auto_run.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ defmodule Examples.ToolBridging do
1818
{:ok, _handle} = Codex.Tools.register(MathTool)
1919

2020
{:ok, thread} =
21-
Codex.start_thread(approval_policy: StaticPolicy.allow())
21+
Codex.start_thread(%{}, %{approval_policy: StaticPolicy.allow()})
2222

2323
{:ok, result} =
2424
Codex.Thread.run_auto(thread, "Ask the math tool to add 4 and 5", max_attempts: 2)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{"type":"thread.started","thread_id":"thread_retry_then_completed"}
2+
{"type":"turn.started","thread_id":"thread_retry_then_completed","turn_id":"turn_retry_then_completed"}
3+
{"type":"error","thread_id":"thread_retry_then_completed","turn_id":"turn_retry_then_completed","message":"Reconnecting... 1/5 (stream disconnected before completion: stream closed before response.completed)","will_retry":true}
4+
{"type":"item.completed","thread_id":"thread_retry_then_completed","turn_id":"turn_retry_then_completed","item":{"id":"item_retry_then_completed","type":"agent_message","text":"Recovered after reconnect."}}
5+
{"type":"turn.completed","thread_id":"thread_retry_then_completed","turn_id":"turn_retry_then_completed","status":"completed","final_response":{"type":"text","text":"Recovered after reconnect."},"usage":{"input_tokens":8,"cached_input_tokens":0,"output_tokens":5,"total_tokens":13}}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{"type":"thread.started","thread_id":"thread_retry_without_completion"}
2+
{"type":"turn.started","thread_id":"thread_retry_without_completion","turn_id":"turn_retry_without_completion"}
3+
{"type":"error","thread_id":"thread_retry_without_completion","turn_id":"turn_retry_without_completion","message":"Reconnecting... 5/5 (stream disconnected before completion: stream closed before response.completed)","will_retry":true}

lib/codex/examples_support.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ defmodule Codex.ExamplesSupport do
2626
if ollama_mode?(), do: nil, else: default
2727
end
2828

29+
@spec conversation_default_mode() :: :multi_turn | :save_resume
30+
def conversation_default_mode do
31+
if ollama_mode?(), do: :save_resume, else: :multi_turn
32+
end
33+
2934
@spec decode_json_result(Result.t()) :: {:ok, term()} | {:error, term()}
3035
def decode_json_result(%Result{} = result) do
3136
case Result.json(result) do
File renamed without changes.

lib/codex/thread.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,7 @@ defmodule Codex.Thread do
974974
defp extract_turn_failure(events) do
975975
find_turn_failed_failure(events) ||
976976
find_turn_completed_failure(events) ||
977+
find_completed_turn_success(events) ||
977978
find_error_failure(events) ||
978979
:ok
979980
end
@@ -1005,6 +1006,10 @@ defmodule Codex.Thread do
10051006
end
10061007
end
10071008

1009+
defp find_completed_turn_success(events) do
1010+
if Enum.any?(events, &completed_turn_success?/1), do: :ok, else: nil
1011+
end
1012+
10081013
defp error_event_payload(%Events.Error{} = event) do
10091014
%{
10101015
"message" => event.message,
@@ -1022,6 +1027,12 @@ defmodule Codex.Thread do
10221027

10231028
defp failed_turn_completed?(_event), do: false
10241029

1030+
defp completed_turn_success?(%Events.TurnCompleted{status: status})
1031+
when status in [nil, "completed", :completed],
1032+
do: true
1033+
1034+
defp completed_turn_success?(_event), do: false
1035+
10251036
defp telemetry_result(:ok, true), do: :early_exit
10261037
defp telemetry_result(:ok, false), do: :ok
10271038
defp telemetry_result({:error, _}, _), do: :error
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmodule Codex.ExamplesSupportTest do
2+
use ExUnit.Case, async: false
3+
4+
alias Codex.ExamplesSupport
5+
6+
describe "conversation_default_mode/0" do
7+
test "uses multi-turn mode outside Ollama" do
8+
restore = capture_env()
9+
10+
on_exit(fn ->
11+
restore_env(restore)
12+
end)
13+
14+
System.delete_env("CODEX_PROVIDER_BACKEND")
15+
System.delete_env("CODEX_OSS_PROVIDER")
16+
17+
assert ExamplesSupport.conversation_default_mode() == :multi_turn
18+
end
19+
20+
test "uses save-resume mode in Ollama" do
21+
restore = capture_env()
22+
23+
on_exit(fn ->
24+
restore_env(restore)
25+
end)
26+
27+
System.put_env("CODEX_PROVIDER_BACKEND", "oss")
28+
System.put_env("CODEX_OSS_PROVIDER", "ollama")
29+
30+
assert ExamplesSupport.conversation_default_mode() == :save_resume
31+
end
32+
end
33+
34+
defp capture_env do
35+
%{
36+
"CODEX_PROVIDER_BACKEND" => System.get_env("CODEX_PROVIDER_BACKEND"),
37+
"CODEX_OSS_PROVIDER" => System.get_env("CODEX_OSS_PROVIDER")
38+
}
39+
end
40+
41+
defp restore_env(saved) do
42+
Enum.each(saved, fn
43+
{key, nil} -> System.delete_env(key)
44+
{key, value} -> System.put_env(key, value)
45+
end)
46+
end
47+
end

test/codex/plugins/scaffold_test.exs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ defmodule Codex.Plugins.ScaffoldTest do
6060
end
6161

6262
defp temp_root(prefix) do
63-
Path.join(System.tmp_dir!(), "#{prefix}_#{System.unique_integer([:positive])}")
63+
Path.join(System.tmp_dir!(), "#{prefix}_#{unique_suffix()}")
64+
end
65+
66+
defp unique_suffix do
67+
Base.encode16(:crypto.strong_rand_bytes(8), case: :lower)
6468
end
6569
end

test/codex/plugins/writer_test.exs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ defmodule Codex.Plugins.WriterTest do
159159
end
160160

161161
defp temp_root(prefix) do
162-
Path.join(System.tmp_dir!(), "#{prefix}_#{System.unique_integer([:positive])}")
162+
Path.join(System.tmp_dir!(), "#{prefix}_#{unique_suffix()}")
163+
end
164+
165+
defp unique_suffix do
166+
Base.encode16(:crypto.strong_rand_bytes(8), case: :lower)
163167
end
164168
end

0 commit comments

Comments
 (0)