diff --git a/docs/index.html b/docs/index.html index 3763d7a9..c1f47408 100644 --- a/docs/index.html +++ b/docs/index.html @@ -756,6 +756,119 @@ border-top: 2px solid #22d3ee; } + /* ─── Section: Multi-Turn Matching ─────────────────────────────── */ + .section-matching { + padding: 4.5rem 0; + position: relative; + background: linear-gradient( + 180deg, + var(--bg-deep) 0%, + #0f1628 30%, + #0f1628 70%, + var(--bg-deep) 100% + ); + } + .section-matching .container { + position: relative; + z-index: 1; + } + .section-matching h2 { + font-size: clamp(1.8rem, 4vw, 2.8rem); + font-weight: 700; + letter-spacing: -0.02em; + text-align: center; + margin-bottom: 1rem; + } + .matching-sub { + text-align: center; + color: var(--text-secondary); + font-size: 1.05rem; + max-width: 640px; + margin: 0 auto 3.5rem; + line-height: 1.7; + } + .matching-criteria { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 2rem; + max-width: 900px; + margin: 3rem auto 0; + position: relative; + } + .matching-criteria::before { + content: ""; + position: absolute; + top: 28px; + left: calc(16.67% + 1rem); + right: calc(16.67% + 1rem); + height: 2px; + background: var(--border); + } + .criteria-item { + text-align: center; + position: relative; + } + .criteria-item-label { + width: 56px; + height: 56px; + border-radius: 50%; + background: var(--bg-card); + border: 2px solid var(--accent); + display: flex; + align-items: center; + justify-content: center; + font-family: var(--font-mono); + font-size: 0.75rem; + font-weight: 700; + color: var(--accent); + margin: 0 auto 1.25rem; + position: relative; + z-index: 1; + } + .criteria-item h3 { + font-family: var(--font-mono); + font-size: 0.95rem; + font-weight: 600; + margin-bottom: 0.5rem; + } + .criteria-item p { + font-size: 0.875rem; + color: var(--text-secondary); + line-height: 1.6; + } + .how-it-works-list { + list-style: none; + padding: 0; + margin: 0; + } + .how-it-works-list li { + padding: 0.75rem 0; + border-bottom: 1px solid var(--border); + font-size: 0.9rem; + line-height: 1.6; + } + .how-it-works-list li:last-child { + border-bottom: none; + } + .how-it-works-list code { + font-family: var(--font-mono); + font-size: 0.85rem; + color: var(--accent); + background: rgba(0, 255, 136, 0.08); + padding: 0.15rem 0.4rem; + border-radius: 4px; + } + + @media (max-width: 768px) { + .matching-criteria { + grid-template-columns: 1fr; + gap: 2.5rem; + } + .matching-criteria::before { + display: none; + } + } + /* ─── Section: Suite Reveal ──────────────────────────────────── */ .section-suite { padding: 4.5rem 0; @@ -1259,9 +1372,8 @@

or
$ - docker run -v $(pwd)/fixtures:/fixtures -p 4010:4010 ghcr.io/copilotkit/aimock + + docker run -v $(pwd)/fixtures:/fixtures -p 4010:4010 ghcr.io/copilotkit/aimock -h 0.0.0.0 -f /fixtures
@@ -1381,7 +1493,102 @@

Replay

- + +
+
+

Match by conversation state, not counters

+

+ Multi-turn AI flows — human-in-the-loop, subagents, tool use — need different + responses at different conversation stages. turnIndex and + hasToolResult match based on what’s already in the request. No mutable + server-side state, safe for concurrent and shared instances. +

+ +
+ +
+
+
+ fixtures.json +
+
+
{
+  "fixtures": [
+    {
+      "match": {
+        "userMessage": "plan a trip",
+        "turnIndex": 0
+      },
+      "response": {
+        "toolCalls": [{ "name": "generate_steps" }]
+      }
+    },
+    {
+      "match": {
+        "userMessage": "plan a trip",
+        "turnIndex": 1
+      },
+      "response": {
+        "content": "Great choices! Your trip is booked."
+      }
+    }
+  ]
+}
+
+
+ + +
+
+
+ how it works +
+
+
    +
  • + Turn 0 — no assistant messages yet → returns tool call + (generate_steps) +
  • +
  • + Turn 1 — one assistant message in history → returns + final answer +
  • +
  • + Stateless — works with 100 concurrent clients, no shared + counters +
  • +
+
+
+
+ +
+
+
0,1,2
+

turnIndex

+

+ Count of assistant messages in the request. Increases with each conversational turn. +

+
+
+
T/F
+

hasToolResult

+

+ Does the request contain tool results? Distinguishes pre- and post-tool-call turns. +

+
+
+
n++
+

sequenceIndex

+

+ Server-side counter for repeated identical requests. Use when stateless criteria + don’t apply. +

+
+
+
+
+
@@ -1470,7 +1677,7 @@

$ npx @copilotkit/aimock --config aimock.json
 
- aimock v1.0.0
+ aimock v1.16.0
 
  LLM    mounted at  /v1/chat/completions
  LLM    mounted at  /v1/messages