Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
816 commits
Select commit Hold shift + click to select a range
a7381e0
merge: keep min_p off OpenAI's own endpoint (PAGI-294)
sirozha Sep 10, 2026
33b8381
fix(llms): give the extra body its own field
sirozha Sep 10, 2026
ed92d8a
merge: give the extra body its own field (PAGI-293)
sirozha Sep 10, 2026
fe7ff17
fix(googleai): stop sending thinking to families that do not think
sirozha Sep 10, 2026
488bff0
merge: stop sending thinking to families that do not think (PAGI-292)
sirozha Sep 10, 2026
7290377
test(googleai): compare the thinking numbers as numbers
sirozha Sep 10, 2026
efecab6
merge: compare the thinking numbers as numbers (PAGI-295)
sirozha Sep 10, 2026
a459111
fix(llms): let an adaptive request without an effort take the vendor …
sirozha Sep 10, 2026
e56a538
merge: let an adaptive request without an effort take the vendor defa…
sirozha Sep 10, 2026
7e2ee31
merge: the caller learns which options never reached the vendor (PAGI…
sirozha Sep 10, 2026
7e4748c
fix(reasoning): give the ollama door its own disable wire
sirozha Sep 10, 2026
e76287c
merge: the ollama door answers about its own disable wire (PAGI-133)
sirozha Sep 10, 2026
4136888
fix(embeddings): refuse a batch the client answered with fewer vectors
sirozha Sep 11, 2026
2a15d56
fix(voyageai): answer a vectorless response with an error, not a panic
sirozha Sep 11, 2026
70f0e12
fix(bedrock): answer a vectorless response with an error, not a panic
sirozha Sep 11, 2026
abd8519
fix(llms): drop the partial slice when the embedding answer is short
sirozha Sep 11, 2026
5d001cf
merge: embedding answers that are empty or short stop being panics an…
sirozha Sep 11, 2026
2f5e016
fix(huggingface): send the caller's output cap, an explicit zero and …
sirozha Sep 11, 2026
4c27cb2
merge: the huggingface door sends the cap it was given and refuses wh…
sirozha Sep 11, 2026
162c3fd
fix(reasoning): stop calling Nova 2 Sonic a model that takes reasonin…
sirozha Sep 11, 2026
d926315
fix(llms): report the sampling an OpenAI reasoning model refuses
sirozha Sep 11, 2026
203ab04
fix(reasoning): classify a fine-tuned model as its base model
sirozha Sep 11, 2026
ff1a98a
fix(llms): decode tool call arguments exactly on googleai and ollama
sirozha Sep 11, 2026
cd6e582
merge: the catalogue, the hint and the tool-call wire agree with the …
sirozha Sep 11, 2026
ae8e357
fix(llms): let a partial answer still answer the truncation question
sirozha Sep 11, 2026
7445699
fix(fake): hand back the collected text when a stream consumer gives up
sirozha Sep 11, 2026
02859bf
merge: an interrupted answer keeps both signals, and the fakes keep t…
sirozha Sep 11, 2026
64226d5
fix(llms): keep an explicit off out of the adaptive hand-off
sirozha Sep 11, 2026
cc3ef5e
fix(openai): let a budget ride with tools, and hand the cost back as …
sirozha Sep 11, 2026
bf1b33c
merge: the openai door keeps the caller's off, budget and cost (PAGI-…
sirozha Sep 11, 2026
5471dd9
fix(vertex): take the credentials the caller names again
sirozha Sep 11, 2026
b0aa3b5
merge: the vertex door authenticates with the caller's service accoun…
sirozha Sep 11, 2026
9129336
fix(llms): read a token budget with one predicate, not two
sirozha Sep 11, 2026
bd34934
fix(llms): let the doors hand the depth to the vendor they were told to
sirozha Sep 11, 2026
8c74336
fix(llms): say so when a door cannot carry the delegation
sirozha Sep 11, 2026
a13116f
merge: an adaptive request without an effort reaches the vendor as on…
sirozha Sep 11, 2026
c0e72f1
fix(httprr): strip the gateway's headers from every recording, not on…
sirozha Sep 11, 2026
93680bd
fix(bedrock): rewrite the recordings without the gateway's headers
sirozha Sep 11, 2026
6b84440
merge: no recording in this repository carries the gateway's headers …
sirozha Sep 11, 2026
ab2eae3
fix(llms): keep the boundaries of a turn's thinking, and refuse an im…
sirozha Sep 11, 2026
9473715
fix(bedrock): read the thinking both streams send, and hand over the …
sirozha Sep 11, 2026
6dcd807
merge: a turn's thinking keeps its blocks across the bedrock and anth…
sirozha Sep 11, 2026
ce69695
fix(llms): stop calling a schema that reached the wire a lost option
sirozha Sep 11, 2026
23eb31d
fix(bedrock): stop calling the caller's own "no tool" a lost tool list
sirozha Sep 11, 2026
b5a2882
fix(bedrock): say so when a legacy payload has nowhere to put the thi…
sirozha Sep 11, 2026
2c7d6da
fix(bedrock): report the thinking mechanism the converse door picked,…
sirozha Sep 11, 2026
8dcf844
fix(bedrock): ask what the payload carries, not what the provider is
sirozha Sep 11, 2026
7fb2a4c
refactor(llms): give every door one list of the options it never reads
sirozha Sep 11, 2026
0bca786
fix(anthropic): let the legacy path answer for what it drops
sirozha Sep 11, 2026
bfc8dec
fix(bedrock): report the answer limit the legacy payload named for th…
sirozha Sep 11, 2026
9228f48
fix(llms): tell the caller what became of an effort on a budget model
sirozha Sep 11, 2026
f49402b
fix(llms): say each lost option once
sirozha Sep 11, 2026
16cbeec
fix(llms): close three silences the parity work left behind
sirozha Sep 11, 2026
f32d642
merge: the warnings surface answers for what a door drops (PAGI-305)
sirozha Sep 11, 2026
6f235af
feat(reasoning): hold every block of a response in its order, and rea…
sirozha Sep 13, 2026
9109db3
fix(anthropic): hand back every thinking block with its own signature…
sirozha Sep 13, 2026
44115da
fix(bedrock): keep every reasoning block of a Converse turn, each in …
sirozha Sep 13, 2026
9bc70e5
fix(bedrock): read the legacy Claude payload block by block, and put …
sirozha Sep 13, 2026
5311089
refactor(reasoning): let the block list carry encrypted thinking, and…
sirozha Sep 13, 2026
ef2bb46
fix(bedrock): count a block's place from the start of the turn on bot…
sirozha Sep 13, 2026
ae8df68
refactor(llms): read a Claude answer in one pass, and keep streamed b…
sirozha Sep 13, 2026
fff7806
docs(bedrock): describe how reasoning blocks keep their signatures an…
sirozha Sep 13, 2026
1a29adc
docs(bedrock): name exactly which lone block keeps the classic fields
sirozha Sep 13, 2026
ee57698
merge: every reasoning block keeps its signature and its place (PAGI-…
sirozha Sep 13, 2026
e9ae11a
docs(reasoning): name which lone block FromBlocks keeps in the classi…
sirozha Sep 13, 2026
e3c31eb
merge: FromBlocks names which lone block keeps the classic fields (PA…
sirozha Sep 13, 2026
2a02688
fix(reasoning): let Bedrock turn thinking off on Opus 5 and Sonnet 5
sirozha Sep 13, 2026
6f03b03
fix(openai): give DeepSeek back the reasoning of every assistant turn
sirozha Sep 13, 2026
b43095c
fix(openai): drop the temperature an OpenAI model refuses while it th…
sirozha Sep 13, 2026
35c8901
fix(googleai): stop sending sampling values nobody asked for
sirozha Sep 13, 2026
49a09c7
fix(openai): keep Kimi's fixed sampling off the wire
sirozha Sep 13, 2026
82ad622
fix(bedrock): refuse structured output for the Claude models Bedrock …
sirozha Sep 13, 2026
61ac151
fix(openai): refuse a JSON schema for DeepSeek and GLM before the req…
sirozha Sep 13, 2026
ebb99f3
fix(ollama): keep the format field off Ollama Cloud and refuse schema…
sirozha Sep 13, 2026
cf4df89
fix(bedrock): lower xhigh and max where Bedrock does not serve them
sirozha Sep 13, 2026
5d4ad5a
fix(openai): send Mistral only the effort it documents
sirozha Sep 13, 2026
b89ada1
fix(anthropic): keep budget under max_tokens unless the model really …
sirozha Sep 13, 2026
dd890fd
fix(googleai): sign a Gemini 3 function call that arrives without a s…
sirozha Sep 13, 2026
19df2c4
merge: requests the vendor documents as refused stop before the netwo…
sirozha Sep 13, 2026
32c5a67
fix(anthropic): send every tool result of a tool message
sirozha Sep 13, 2026
f5aaaa2
fix(bedrock): drop the empty text block from a replayed legacy Claude…
sirozha Sep 13, 2026
489f5e5
merge: a replayed Claude turn keeps every tool result and no empty te…
sirozha Sep 13, 2026
1239856
fix(openai): give Kimi and GLM back the reasoning of every assistant …
sirozha Sep 13, 2026
516af3a
fix(openai): refuse a JSON schema for GLM in every spelling of its name
sirozha Sep 13, 2026
b51b009
fix(googleai): keep a configured zero top_p or top_k on the wire
sirozha Sep 13, 2026
010688e
fix(ollama): treat a -cloud model on a local server as Ollama Cloud
sirozha Sep 13, 2026
d4d0e29
docs: correct three statements the pre-network work made false
sirozha Sep 13, 2026
3bb6954
merge: the review of the pre-network work leaves no spelling or turn …
sirozha Sep 13, 2026
e44296f
fix(bedrock): drop an empty text block that carries a cache marker too
sirozha Sep 13, 2026
8a736bf
merge: an empty text block leaves the legacy payload even with a cach…
sirozha Sep 13, 2026
225a9fc
fix(openai): let GLM served by Mistral keep the schema Mistral docume…
sirozha Sep 13, 2026
c07fcc3
test: pin four guards the second review found unguarded
sirozha Sep 13, 2026
1860585
merge: the second review leaves no spelling or guard behind (PAGI-133…
sirozha Sep 13, 2026
4dad8a8
fix(openai): read Mistral's thinking chunks and send them back the wa…
sirozha Sep 13, 2026
1ffd046
merge: Mistral's thinking chunks read and replayed through the openai…
sirozha Sep 13, 2026
39bd660
fix(reasoning): count only Mistral's own spellings as served by Mistral
sirozha Sep 13, 2026
5a23bb1
test: pin the prefixed spelling of a Mistral model that does not reason
sirozha Sep 13, 2026
3517d05
test: pin joining the text chunks of one Mistral answer
sirozha Sep 13, 2026
0a52486
merge: only Mistral's own spellings get the thinking-chunk replay (PA…
sirozha Sep 13, 2026
f81a209
test: pin the moved cache marker walking past a redacted thinking block
sirozha Sep 13, 2026
9c70cd5
merge: the moved cache marker skips redacted thinking under test (PAG…
sirozha Sep 13, 2026
80f8220
fix(reasoning): refuse any host prefix left after mistral/ in ServedB…
sirozha Sep 13, 2026
2af9445
merge: a host prefix after mistral/ is never Mistral's (PAGI-328)
sirozha Sep 13, 2026
dc2be39
fix(googleai): give every streamed call without an ID its own ID
sirozha Sep 14, 2026
0cf20b5
fix(reasoning): switch thinking off on DashScope guests with enable_t…
sirozha Sep 14, 2026
2e0721a
fix(reasoning): switch thinking off on GLM served by Mistral by omitt…
sirozha Sep 14, 2026
8be8c30
fix(llms): report Qwen's opt-in thinking as off by default in the hint
sirozha Sep 14, 2026
ee34715
test(openai): pin the off wire of GLM and DeepSeek behind dashscope/ …
sirozha Sep 14, 2026
b7b35a5
test(llms): pin that opt-in alone does not make the hint report think…
sirozha Sep 14, 2026
07f62d5
test: pin six guards whose negation no test noticed (PAGI-337)
sirozha Sep 14, 2026
b54d2d9
fix(bedrock): leave an assistant turn that carries nothing off the Co…
sirozha Sep 14, 2026
962f8d2
fix(openai): leave DeepSeek's penalties out, and its temperature whil…
sirozha Sep 14, 2026
34a4387
test: pin the exact value every clamp and substitute warning reports …
sirozha Sep 14, 2026
9f2d8d7
fix(openai): leave top_k off MiniMax's API, which has no field for it
sirozha Sep 14, 2026
9475176
test: read the wire in the tests that only checked for no warning (PA…
sirozha Sep 14, 2026
7032ea0
fix(openai): refuse a JSON schema for MiniMax M-series before the req…
sirozha Sep 14, 2026
b9e5acb
test: pin the exact depth a named effort gets under adaptive on googl…
sirozha Sep 14, 2026
b70ab1d
test: the mistral Call refusal must be the truncation error (PAGI-337)
sirozha Sep 14, 2026
973ff6b
test(llmtest): fail a door that takes tools and never calls one (PAGI…
sirozha Sep 14, 2026
e1d18de
test(reasoning): check that each door passes its own provider constan…
sirozha Sep 14, 2026
a0baa8a
test(llms): reach the unclassified openai branch with Mistral's magis…
sirozha Sep 14, 2026
af74c13
fix(reasoning): turn thinking off on Claude 5 behind the openai door
sirozha Sep 14, 2026
6bec5f8
fix(openai): send a Claude thinking budget in Anthropic's thinking ob…
sirozha Sep 14, 2026
d981b17
fix(llms): name the think levels gpt-oss takes on the ollama door in …
sirozha Sep 14, 2026
4023aad
fix(openai): keep JSON mode off the wire for Claude and say so
sirozha Sep 14, 2026
f598c2d
test(openai): check top_p in the Claude sampling test of the openai door
sirozha Sep 14, 2026
9ea67b8
fix(bedrock): send gpt-oss the reasoning_effort its Converse request …
sirozha Sep 14, 2026
e246028
fix(llms): offer the gpt-oss levels on the Bedrock hint
sirozha Sep 14, 2026
1c592be
test(llmtest): spare a door that reports the tools dropped (PAGI-337)
sirozha Sep 15, 2026
d1a8ef8
test(openai): hold the qwen3-max budget warning to the wire, not to 2…
sirozha Sep 15, 2026
1d8ad3c
fix(openai): take DeepSeek's temperature rule only on DeepSeek's own …
sirozha Sep 15, 2026
3c9a4d3
fix(reasoning): count deepseek-flash as a model that thinks by default
sirozha Sep 15, 2026
91acf11
fix(openai): leave DeepSeek's top_p out once it is not thinking
sirozha Sep 15, 2026
4ba2e12
fix(openai): leave response_format off MiniMax M-series in JSON mode
sirozha Sep 15, 2026
6a4cf82
fix(reasoning): resolve deepseek-flash as the model deepseek-v4-flash…
sirozha Sep 15, 2026
ab0b660
fix(reasoning): refuse gpt-oss off on Bedrock under its GovCloud ID too
sirozha Sep 15, 2026
397ba14
fix(openai): give Qwen back the reasoning of every assistant turn too
sirozha Sep 15, 2026
51b63ac
fix(reasoning): keep reasoning_effort off GLM before 5.2 and Kimi K2
sirozha Sep 15, 2026
7a5ee80
fix(reasoning): keep reasoning_effort off MiniMax
sirozha Sep 15, 2026
cea0a15
fix(openai): give MiniMax back its reasoning inside think tags on eve…
sirozha Sep 15, 2026
2f174a8
fix(openai): refuse a thinking budget that no field on the door can c…
sirozha Sep 15, 2026
6f0c1f5
test(openai): pin a budget on GLM 5.2+ and Kimi K3 to the adaptive-on…
sirozha Sep 15, 2026
454df74
fix(llms): offer Nova 2 Lite's off on the Bedrock hint
sirozha Sep 15, 2026
1d71dec
test(openai): pin the thinking wire of GLM, Kimi and MiniMax on each …
sirozha Sep 15, 2026
0fc2f42
fix(openai): leave a MiniMax turn alone when its content opens with a…
sirozha Sep 15, 2026
8d2f933
test(openai): pin a MiniMax turn without reasoning going back without…
sirozha Sep 15, 2026
88d9f1c
test(openai): pin the budget refusal when only one reasoning-object o…
sirozha Sep 15, 2026
c2a4f22
test(reasoning): pin that an undated GLM alias is not a pre-5.2 gener…
sirozha Sep 15, 2026
207aef7
merge: switch thinking off by the host that serves GLM and DeepSeek (…
sirozha Sep 15, 2026
8846f5a
merge: Claude behind the openai door gets its documented off, budget …
sirozha Sep 15, 2026
5ab7350
merge: no reasoning_effort for GLM before 5.2, Kimi K2 and MiniMax (P…
sirozha Sep 15, 2026
230b6e2
merge: leave out what DeepSeek and MiniMax ignore (PAGI-333)
sirozha Sep 15, 2026
deb66d9
merge: replay reasoning on every turn for Qwen and MiniMax (PAGI-334)
sirozha Sep 15, 2026
cf329b8
merge: the hint reports Qwen's opt-in thinking as off by default (PAG…
sirozha Sep 15, 2026
ad234eb
merge: the hint names the think levels gpt-oss takes on the ollama do…
sirozha Sep 15, 2026
10b2fa7
merge: resolve deepseek-flash as the model deepseek-v4-flash names (P…
sirozha Sep 15, 2026
72f5ee5
merge: every streamed googleai call without an ID gets its own ID (PA…
sirozha Sep 15, 2026
e237099
merge: an empty assistant turn stays off the Converse wire (PAGI-336)
sirozha Sep 15, 2026
c7a62d1
merge: Bedrock open models get the thinking controls AWS documents (P…
sirozha Sep 15, 2026
fe97a00
test(llms): leave gpt-oss on Bedrock to the Bedrock hint tests
sirozha Sep 15, 2026
981983f
merge: pin the guards that survived mutation and the weak checks (PAG…
sirozha Sep 15, 2026
965d331
refactor(llms): build the level-only hint of gpt-oss, Nova and ollama…
sirozha Sep 15, 2026
6aa6de9
fix(googleai): surface a failed stream before the empty-stream budget…
sirozha Sep 15, 2026
7e8acae
fix(openai): leave the DashScope thinking budget out of the answer-li…
sirozha Sep 15, 2026
f2da7a9
fix(reasoning): let every DashScope GLM and Kimi guest carry a thinki…
sirozha Sep 15, 2026
9e17757
fix(llms): report an explicit zero seed as a dropped option
sirozha Sep 15, 2026
fc1fed1
fix(openai): keep top_k off DeepSeek's own door
sirozha Sep 15, 2026
327b9fd
test(openai): mark the DashScope budget table as a long table test
sirozha Sep 15, 2026
2306b4e
merge: the library debt left on the Story (PAGI-247)
sirozha Sep 17, 2026
0a9aec0
fix(openai): leave the fields extra body does not name as the door bu…
sirozha Sep 17, 2026
61477f9
fix(openai): merge extra body objects into the objects the door builds
sirozha Sep 17, 2026
78d5239
test(openai): pin the GPT-5 sampling that survives none and dies at m…
sirozha Sep 17, 2026
cd41669
test(googleai): pin that a thinking Gemini 3 call keeps the caller's …
sirozha Sep 17, 2026
cb9e16f
test(bedrock): pin the top_p floor on a Claude model that takes both …
sirozha Sep 17, 2026
68f51d2
test(reasoning): pin where DeepSeek stops waiting to be asked
sirozha Sep 17, 2026
6c2d6cc
refactor(llms): drop the vendor-fact comments that tests already pin
sirozha Sep 17, 2026
689197b
fix(openai): let an extra body object of another type replace the door's
sirozha Sep 17, 2026
e9ff02b
merge: an extra body object merges into the object the door builds (P…
sirozha Sep 17, 2026
0c57ff2
fix(reasoning): stop presenting GLM 4.7, 4.7 Flash and 5 as reasoning…
sirozha Sep 17, 2026
eca1855
merge: GLM 4.7, 4.7 Flash and 5 offer no reasoning control on Bedrock…
sirozha Sep 17, 2026
2d4d83a
merge: vendor facts and version boundaries are pinned by tests, not c…
sirozha Sep 17, 2026
dc9cfa3
fix(openai): turn adaptive thinking on for Claude 4.6-4.8 when the de…
sirozha Sep 17, 2026
5109954
fix(openai): ask Claude for summarized thinking when the depth is del…
sirozha Sep 17, 2026
5d719f3
test(openai): pin that a Claude request without reasoning goes out wi…
sirozha Sep 17, 2026
e3e6509
fix(openai): keep the adaptive thinking object off hosts that resell …
sirozha Sep 17, 2026
f09c0cd
fix(openai): report adaptive thinking instead of sending it to Anthro…
sirozha Sep 17, 2026
854dec5
docs(reasoning): state only what AWS documents for the Bedrock non-re…
sirozha Sep 17, 2026
1509b88
test(bedrock): pin structured output on the us. and global. spellings…
sirozha Sep 17, 2026
0cc473d
merge: delegated adaptive thinking reaches Claude Opus 4.6-4.8 and So…
sirozha Sep 17, 2026
d9b9b44
merge: the Bedrock non-reasoning list states only what AWS documents …
sirozha Sep 17, 2026
99631b2
test(bedrock): pin that an adaptive request on a model without a mech…
sirozha Sep 17, 2026
d9514e1
docs(bedrock): stop listing Nova 2 Sonic among the models that take r…
sirozha Sep 17, 2026
833b236
docs(bedrock): stop presenting GLM 4.7, 4.7 Flash and 5 as reasoning …
sirozha Sep 17, 2026
eb17e49
docs(reasoning): drop the vendor sentence tests already pin from Nova…
sirozha Sep 17, 2026
e93843d
docs(reasoning): describe IsBedrockNonReasoningModel as the list it c…
sirozha Sep 17, 2026
5a43de8
docs(reasoning): drop the NovaEffort comment that restates its switch
sirozha Sep 17, 2026
28e64e9
docs(reasoning): drop the EffortToolsDisable comment the wire test pins
sirozha Sep 17, 2026
3fc454e
test(llmtest): drop the tool-probe comments that contradict the check…
sirozha Sep 17, 2026
5cdd492
fix(reasoning): keep the thinking budget off DashScope's glm-5.3
sirozha Sep 17, 2026
a7e9bbb
fix(openai): send the DashScope guest budget next to the answer-only …
sirozha Sep 17, 2026
bf7897d
fix(openai): leave answer room in the DashScope DeepSeek V4 thinking …
sirozha Sep 17, 2026
9a22b9b
fix(openai): turn thinking on for DashScope's Kimi K2.5 and K2.6 when…
sirozha Sep 17, 2026
a0fffdf
fix(openai): give a model sent to DashScope's own host the DashScope …
sirozha Sep 17, 2026
f36aab1
fix(openai): keep top_k off the DeepSeek, Kimi and MiniMax models Das…
sirozha Sep 17, 2026
1f12204
fix(openai): keep the Claude budget object off hosts that document no…
sirozha Sep 17, 2026
d861f6e
fix(reasoning): refuse turning off a default-on Claude where no think…
sirozha Sep 17, 2026
0bd22a3
fix(openai): send Anthropic's thinking object only to hosts outside t…
sirozha Sep 17, 2026
b8ea044
test(openai): pin the Claude thinking object route list as an allow-list
sirozha Sep 17, 2026
73a1618
fix(openai): hold a client-level json_object to the JSON-mode model rule
sirozha Sep 17, 2026
a6994ea
merge: DashScope guests get the documented budget, off and top_k wire…
sirozha Sep 17, 2026
1a2f600
merge: Anthropic's thinking object stays on the routes that take it f…
sirozha Sep 17, 2026
1608cb4
merge: a client-level json_object follows the JSON-mode model rule (P…
sirozha Sep 17, 2026
ba8ca21
merge: Bedrock docs and reasoning comments state only what the code d…
sirozha Sep 17, 2026
200f1a6
fix(bedrock): refuse structured output on models whose AWS model card…
sirozha Sep 17, 2026
e28a81a
merge: Bedrock structured output follows the AWS model cards (PAGI-247)
sirozha Sep 17, 2026
c21b34b
test(chains): pin the model the cassettes record
sirozha Sep 17, 2026
4e702f2
merge: chains replays the cassettes it records (PAGI-125)
sirozha Sep 17, 2026
4ea2c28
fix(reasoning): the Bedrock non-reasoning verdict reads the inference…
sirozha Sep 17, 2026
a515a18
merge: the Bedrock verdict reads region-prefixed ids (PAGI-125)
sirozha Sep 17, 2026
cf6e06b
feat(reasoning): carry GPT-6 Astra by its model card
sirozha Sep 18, 2026
32b9b9d
merge: GPT-6 Astra is carried by its model card (PAGI-125)
sirozha Sep 18, 2026
fa65c91
fix(reasoning): GPT-6 Astra takes the four effort levels its endpoint…
sirozha Sep 18, 2026
7ca2ccb
merge: Astra's effort set follows the endpoint, not the card (PAGI-125)
sirozha Sep 18, 2026
2edb2f9
fix(reasoning): GLM 5.3 keeps thinking under the spelling Mistral ser…
sirozha Sep 18, 2026
da82eee
merge: GLM 5.3 keeps thinking under the Mistral spelling (PAGI-125)
sirozha Sep 18, 2026
405ffe2
feat(bedrock): gpt-oss-safeguard takes the reasoning effort OpenAI do…
sirozha Sep 18, 2026
c2d68ef
merge: gpt-oss-safeguard carries its documented effort (PAGI-125)
sirozha Sep 18, 2026
504595c
feat: implement metadata indexing and filtering in pgvector
asdek Sep 21, 2026
da097ac
fix(pgvector): a failed init rolls back instead of keeping its connec…
sirozha Sep 22, 2026
d88b9de
fix(reasoning): grok-4.7 always reasons, so a disable is refused befo…
sirozha Sep 22, 2026
d3bf3ec
test(reasoning): pin grok-4.7 spellings where every other family's ar…
sirozha Sep 22, 2026
dd63f69
feat(reasoning): add support for new GPT-6 generations and update cap…
asdek Sep 22, 2026
9a40f2f
fix(reasoning): a us-gov model keeps the capabilities of its bare name
sirozha Sep 22, 2026
9a0394f
fix(reasoning): gpt-6-sol and gpt-6-luna take function tools only wit…
sirozha Sep 22, 2026
e1c0414
test(openai): pin max to xhigh for gpt-6-sol and gpt-6-luna
sirozha Sep 22, 2026
abcf47d
fix(pgvector): a cancelled init rolls back before the commit can clos…
sirozha Sep 22, 2026
fdf1f72
test(pgvector): explain the statement SimilaritySearch sends, not a copy
sirozha Sep 22, 2026
a35a0a3
fix(pgvector): a derived index name tells every declaration apart
sirozha Sep 22, 2026
40b6fb1
fix(pgvector): a derived index name stays valid UTF-8 and the name gu…
sirozha Sep 22, 2026
c981c07
test(pgvector): the plan test builds its own tables
sirozha Sep 22, 2026
74cce2a
fix(openai): the none that function tools force keeps the caller's sa…
sirozha Sep 22, 2026
7ab52b8
fix(pgvector): the name guard compares what two declarations define, …
sirozha Sep 22, 2026
cbf020b
test(pgvector): the name guard refuses exclusions that differ under o…
sirozha Sep 22, 2026
ddc9643
merge: pgvector index names and init cancellation, gpt-6-sol/luna too…
sirozha Sep 22, 2026
6b7f9a0
fix(gemini): update Google AI LLM test to use "gemini-3.8-flash" mode…
asdek Sep 23, 2026
506e5d8
fix(tests): update OpenAI LLM tests to use "gpt-4.1-nano" model and i…
asdek Sep 23, 2026
a412982
refactor(tests): streamline test setup by removing redundant recordin…
asdek Sep 23, 2026
25e16ca
feat(tests): add lateBodyTransport to handle request body reading in …
asdek Sep 23, 2026
e4b6095
feat(ollama): implement structured output fallback for cloud models
asdek Sep 24, 2026
355dc71
feat(openai): implement structured output fallback for DeepSeek and Z…
asdek Sep 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ jobs:
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
set -o pipefail
go test -timeout=20m -race -v -json -coverprofile=coverage-${{ steps.go-version.outputs.version }}.out ./... | tee test-results-${{ steps.go-version.outputs.version }}.ndjson
- name: Upload test results
uses: actions/upload-artifact@v4
Expand All @@ -80,7 +81,6 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/examples.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,4 @@ jobs:
run: |
cd examples/${{ matrix.example }}
echo "Building ${{ matrix.example }}"
go mod tidy
go build -o /dev/null .
go build -mod=readonly -o /dev/null .
17 changes: 0 additions & 17 deletions .github/workflows/publish-docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ permissions:
contents: read
pages: write
id-token: write
pull-requests: write

# Allow only one concurrent deployment
concurrency:
Expand Down Expand Up @@ -74,19 +73,3 @@ jobs:
artifact_name: github-pages
preview: ${{ github.ref != 'refs/heads/main-vxcontrol' }}

- name: Comment PR
if: |
github.event_name == 'pull_request' &&
(github.ref == 'refs/heads/docs-test' ||
startsWith(github.ref, 'refs/heads/docs/'))
uses: actions/github-script@v7
with:
script: |
const url = '${{ steps.deployment.outputs.page_url }}';
const message = `📚 Documentation preview available at: ${url}`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: message
});
26 changes: 18 additions & 8 deletions .golangci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,6 @@ linters:
gosec:
excludes:
- G115
# G703/G704: gosec's taint-analysis engine flags any function parameter
# of a matching type (e.g. a file path or URL string) as tainted based
# solely on its type, not on whether it actually originates from
# untrusted input. This produces widespread false positives in library
# code where callers pass in paths/URLs directly (see
# https://github.com/securego/gosec/issues/1500).
- G703
- G704
exhaustive:
default-signifies-exhaustive: true
exclusions:
Expand All @@ -53,6 +45,24 @@ linters:
- common-false-positives
- legacy
- std-error-handling
rules:
# The stub is a proxy: forwarding the request it received is its purpose.
- path: httputil/transport_test\.go
linters:
- gosec
text: G704
# url.Parse taints the helper, but what reaches os.Open is the name
# os.CreateTemp chose, which the URL cannot influence.
- path: documentloaders/whisper\.go
linters:
- gosec
text: G703
# Fetching the endpoint its caller configured is what this client does;
# a url.URL parameter is a taint source by declaration.
- path: vectorstores/qdrant/rest\.go
linters:
- gosec
text: G704
paths:
- internal
- vectorstores/bedrockknowledgebases
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ clean-lint-cache:
.PHONY: build-examples
build-examples:
for example in $(shell find ./examples -mindepth 1 -maxdepth 1 -type d); do \
(cd $$example; echo Build $$example; go mod tidy; go build -o /dev/null) || exit 1; done
(cd $$example; echo Build $$example; go build -mod=readonly -o /dev/null) || exit 1; done

.PHONY: update-examples
update-examples:
Expand Down
38 changes: 6 additions & 32 deletions agents/conversational_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package agents

import (
"context"
"os"
"path/filepath"
"regexp"
"strings"
"testing"

"github.com/vxcontrol/langchaingo/chains"
Expand All @@ -18,24 +15,13 @@ import (
"github.com/stretchr/testify/require"
)

// hasExistingRecording checks if a httprr recording exists for this test
func hasExistingRecording(t *testing.T) bool {
testName := strings.ReplaceAll(t.Name(), "/", "_")
testName = strings.ReplaceAll(testName, " ", "_")
recordingPath := filepath.Join("testdata", testName+".httprr")
_, err := os.Stat(recordingPath)
return err == nil
}

func TestConversationalWithMemory(t *testing.T) {
t.Parallel()

// Skip if no recording available and no credentials
if !hasExistingRecording(t) {
t.Skip("No httprr recording available. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
httprr.SkipIfNoCredentialsAndRecordingMissing(t, "OPENAI_API_KEY")

rr := httprr.OpenForTest(t, httputil.DefaultTransport)
if !rr.Recording() {
t.Parallel()
}
// Configure OpenAI client with httprr
opts := []openai.Option{
openai.WithModel("gpt-4o"),
Expand All @@ -58,22 +44,10 @@ func TestConversationalWithMemory(t *testing.T) {

ctx := context.Background()
_, err = chains.Run(ctx, executor, "Hi! my name is Bob and the year I was born is 1987")
if err != nil {
// Check if this is a recording mismatch error
if strings.Contains(err.Error(), "cached HTTP response not found") {
t.Skip("Recording format has changed or is incompatible. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
require.NoError(t, err)
}
require.NoError(t, err)

res, err := chains.Run(t.Context(), executor, "What is the year I was born times 34")
if err != nil {
// Check if this is a recording mismatch error
if strings.Contains(err.Error(), "cached HTTP response not found") {
t.Skip("Recording format has changed or is incompatible. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
require.NoError(t, err)
}
require.NoError(t, err)
expectedRe := "67,?558"
if !regexp.MustCompile(expectedRe).MatchString(res) {
t.Errorf("result does not contain the crrect answer '67558', got: %s", res)
Expand Down
34 changes: 10 additions & 24 deletions agents/executor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,14 @@ func TestExecutorWithErrorHandler(t *testing.T) {
}

func TestExecutorWithMRKLAgent(t *testing.T) {
t.Parallel()
ctx := t.Context()

// Skip if no recording available and no credentials
if !hasExistingRecording(t) {
t.Skip("No httprr recording available. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
httprr.SkipIfNoCredentialsAndRecordingMissing(t, "OPENAI_API_KEY")

rr := httprr.OpenForTest(t, http.DefaultTransport)
if !rr.Recording() {
t.Parallel()
}

// Configure OpenAI client with httprr
opts := []openai.Option{
Expand Down Expand Up @@ -118,29 +117,22 @@ func TestExecutorWithMRKLAgent(t *testing.T) {
require.NoError(t, err)

result, err := chains.Run(ctx, a, "What is 5 plus 3? Please calculate this.") //nolint:lll
if err != nil {
// Check if this is a recording mismatch error
if strings.Contains(err.Error(), "cached HTTP response not found") {
t.Skip("Recording format has changed or is incompatible. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
require.NoError(t, err)
}
require.NoError(t, err)

t.Logf("MRKL Agent response: %s", result)
// Simple calculation: 5 + 3 = 8
require.True(t, strings.Contains(result, "8"), "expected calculation result 8 in response")
}

func TestExecutorWithOpenAIFunctionAgent(t *testing.T) {
t.Parallel()
ctx := t.Context()

// Skip if no recording available and no credentials
if !hasExistingRecording(t) {
t.Skip("No httprr recording available. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
httprr.SkipIfNoCredentialsAndRecordingMissing(t, "OPENAI_API_KEY")

rr := httprr.OpenForTest(t, http.DefaultTransport)
if !rr.Recording() {
t.Parallel()
}

// Configure OpenAI client with httprr
opts := []openai.Option{
Expand Down Expand Up @@ -178,13 +170,7 @@ func TestExecutorWithOpenAIFunctionAgent(t *testing.T) {
require.NoError(t, err)

result, err := chains.Run(ctx, e, "when was the Go programming language tagged version 1.0?") //nolint:lll
if err != nil {
// Check if this is a recording mismatch error
if strings.Contains(err.Error(), "cached HTTP response not found") {
t.Skip("Recording format has changed or is incompatible. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
require.NoError(t, err)
}
require.NoError(t, err)

t.Logf("Result: %s", result)

Expand Down
37 changes: 8 additions & 29 deletions agents/openai_functions_agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ package agents_test

import (
"net/http"
"os"
"path/filepath"
"strings"
"testing"

Expand All @@ -18,25 +16,15 @@ import (
"github.com/stretchr/testify/require"
)

// hasExistingRecording checks if a httprr recording exists for this test
func hasExistingRecording(t *testing.T) bool {
testName := strings.ReplaceAll(t.Name(), "/", "_")
testName = strings.ReplaceAll(testName, " ", "_")
recordingPath := filepath.Join("testdata", testName+".httprr")
_, err := os.Stat(recordingPath)
return err == nil
}

func TestOpenAIFunctionsAgentWithHTTPRR(t *testing.T) {
t.Parallel()
ctx := t.Context()

// Skip if no recording available and no credentials
if !hasExistingRecording(t) {
t.Skip("No httprr recording available. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
httprr.SkipIfNoCredentialsAndRecordingMissing(t, "OPENAI_API_KEY")

rr := httprr.OpenForTest(t, http.DefaultTransport)
if !rr.Recording() {
t.Parallel()
}

// Configure OpenAI client with httprr
opts := []openai.Option{
Expand Down Expand Up @@ -68,10 +56,6 @@ func TestOpenAIFunctionsAgentWithHTTPRR(t *testing.T) {
// Run a simple calculation
result, err := chains.Run(ctx, executor, "What is 15 multiplied by 4?")
if err != nil {
// Check if this is a recording mismatch error
if strings.Contains(err.Error(), "cached HTTP response not found") {
t.Skip("Recording format has changed or is incompatible. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
t.Fatal(err)
}

Expand All @@ -84,15 +68,14 @@ func TestOpenAIFunctionsAgentWithHTTPRR(t *testing.T) {
}

func TestOpenAIFunctionsAgentComplexCalculation(t *testing.T) {
t.Parallel()
ctx := t.Context()

// Skip if no recording available and no credentials
if !hasExistingRecording(t) {
t.Skip("No httprr recording available. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
httprr.SkipIfNoCredentialsAndRecordingMissing(t, "OPENAI_API_KEY")

rr := httprr.OpenForTest(t, http.DefaultTransport)
if !rr.Recording() {
t.Parallel()
}

// Configure OpenAI client with httprr
opts := []openai.Option{
Expand Down Expand Up @@ -128,10 +111,6 @@ func TestOpenAIFunctionsAgentComplexCalculation(t *testing.T) {
// Run a more complex calculation
result, err := chains.Run(ctx, executor, "If I have 3 groups of 7 items, and I add 9 more items, how many items do I have in total?")
if err != nil {
// Check if this is a recording mismatch error
if strings.Contains(err.Error(), "cached HTTP response not found") {
t.Skip("Recording format has changed or is incompatible. Hint: Re-run tests with -httprecord=. to record new HTTP interactions")
}
t.Fatalf("failed to run agent: %v", err)
}
t.Logf("Agent response: %s", result)
Expand Down
12 changes: 6 additions & 6 deletions agents/testdata/TestConversationalWithMemory.httprr

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading