shikumi 0.3.0.1 → 0.3.0.2
raw patch · 5 files changed
+42/−17 lines, 5 filesdep ~baikaidep ~baikai-claudedep ~baikai-effectfulPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: baikai, baikai-claude, baikai-effectful, baikai-openai
API changes (from Hackage documentation)
Files
- CHANGELOG.md +14/−0
- shikumi.cabal +10/−10
- test/RoutingSpec.hs +1/−1
- test/StreamSpec.hs +1/−1
- test/StubProvider.hs +16/−5
CHANGELOG.md view
@@ -2,6 +2,20 @@ ## Unreleased +## 0.3.0.2 — 2026-08-07++### Changed++- Upgraded the baikai provider cohort to the `0.5` series: `baikai`,+ `baikai-claude`, and `baikai-openai` now require `>=0.5 && <0.6`.+ `baikai-effectful` stays on the `0.3` series, floored at `0.3.0.3` — the first+ release whose own `baikai` bound admits `0.5`. Dependency bounds only; no+ changes to the exported API.++ baikai 0.5 adds an optional model-call evidence record. shikumi does not opt+ in: it never sets `Options.evidence`, so no digest is computed and no evidence+ event is emitted on any call shikumi makes.+ ## 0.3.0.1 - 2026-07-20 ### Changed
shikumi.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.4 name: shikumi-version: 0.3.0.1+version: 0.3.0.2 synopsis: Typed, structured, evaluable LM programs over baikai category: AI description:@@ -53,11 +53,11 @@ build-depends: , aeson- , baikai >=0.4 && <0.5- , baikai-claude >=0.4 && <0.5- , baikai-effectful >=0.3 && <0.4- , baikai-openai >=0.4 && <0.5- , base >=4.20 && <5+ , baikai >=0.5 && <0.6+ , baikai-claude >=0.5 && <0.6+ , baikai-effectful >=0.3.0.3 && <0.4+ , baikai-openai >=0.5 && <0.6+ , base >=4.20 && <5 , base64-bytestring , bytestring , containers@@ -109,10 +109,10 @@ build-depends: , aeson- , baikai >=0.4 && <0.5- , baikai-claude >=0.4 && <0.5- , baikai-effectful >=0.3 && <0.4- , baikai-openai >=0.4 && <0.5+ , baikai >=0.5 && <0.6+ , baikai-claude >=0.5 && <0.6+ , baikai-effectful >=0.3.0.3 && <0.4+ , baikai-openai >=0.5 && <0.6 , base , base64-bytestring , bytestring
test/RoutingSpec.hs view
@@ -98,7 +98,7 @@ liftIO (atomicModifyIORef' ref (\xs -> (xs ++ [(m, ctx, o)], ()))) -- A minimal successful stream whose terminal reassembles to @resp@, so a -- routed 'streamProgram' decodes exactly as the blocking path would.- pure [EventDone (doneTerminal Nothing Stop (AssistantMessage (resp ^. #message)))]+ pure [EventDone (doneTerminal Nothing Nothing Stop (AssistantMessage (resp ^. #message)))] -- | Run a program sequentially under @routeLLM . runRouting model@ over a capturing -- stub and return the captured requests.
test/StreamSpec.hs view
@@ -122,7 +122,7 @@ ] ++ [TextDelta (DeltaPayload 0 d) | d <- deltas] ++ [ TextEnd (BlockEndPayload 0 (T.concat deltas)),- EventDone (doneTerminal Nothing Stop (AssistantMessage (payloadWith terminalText)))+ EventDone (doneTerminal Nothing Nothing Stop (AssistantMessage (payloadWith terminalText))) ] where payloadWith t = (_Response ^. #message) & #content .~ V.singleton (AssistantText (_TextContent & #text .~ t))
test/StubProvider.hs view
@@ -53,6 +53,14 @@ stubApi :: Api stubApi = Custom "stub" +-- | Every stub ignores 'Options.thinking' and puts nothing on any wire, so the+-- truthful description of what it does with a reasoning-effort request is+-- 'noThinkingRequested' — not a translation invented to look plausible.+-- baikai only calls this for a caller who asked for strict evidence, which no+-- shikumi interpreter does.+stubDescribeThinking :: Model -> Options -> ThinkingTranslation+stubDescribeThinking _ _ = noThinkingRequested+ -- | A hand-built 'Model' whose 'api' routes to the stub provider. stubModel :: Model stubModel =@@ -101,7 +109,7 @@ TextStart IndexPayload {contentIndex = 0}, TextDelta DeltaPayload {contentIndex = 0, delta = t}, TextEnd BlockEndPayload {contentIndex = 0, content = t},- EventDone (doneTerminal Nothing Stop (AssistantMessage (stubPayloadWith t)))+ EventDone (doneTerminal Nothing Nothing Stop (AssistantMessage (stubPayloadWith t))) ] -- | Build an isolated registry from a @complete@ implementation, reusing the@@ -114,7 +122,8 @@ ApiProvider { apiTag = stubApi, complete = completeFn,- stream = \_ _ _ -> Stream.fromList (stubEvents streamText)+ stream = \_ _ _ -> Stream.fromList (stubEvents streamText),+ describeThinking = stubDescribeThinking } pure reg @@ -159,7 +168,7 @@ streamErrorEvents :: Rational -> Text -> [AssistantMessageEvent] streamErrorEvents cost msg = [ EventStart StartPayload {partial = AssistantMessage (_Response ^. #message), responseId = Nothing},- EventError (doneTerminal Nothing ErrorReason (AssistantMessage errPayload))+ EventError (doneTerminal Nothing Nothing ErrorReason (AssistantMessage errPayload)) ] where errPayload =@@ -189,7 +198,8 @@ Stream.fromList $ if n <= failTimes then streamErrorEvents 0 ("stub stream failure #" <> T.pack (show n))- else stubEvents t+ else stubEvents t,+ describeThinking = stubDescribeThinking } pure reg @@ -204,7 +214,8 @@ ApiProvider { apiTag = stubApi, complete = \_ _ _ -> pure (stubResponse ""),- stream = \_ _ _ -> Stream.fromList (streamErrorEvents cost "stub stream failure")+ stream = \_ _ _ -> Stream.fromList (streamErrorEvents cost "stub stream failure"),+ describeThinking = stubDescribeThinking } pure reg