Skip to content

Commit dc7ffee

Browse files
committed
chore: remove serialize_openapi_schema_ordered function
1 parent 7fa1eb3 commit dc7ffee

File tree

3 files changed

+2
-109
lines changed

3 files changed

+2
-109
lines changed

anda_core/src/model.rs

Lines changed: 0 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
//! - Core AI capabilities traits ([`CompletionFeatures`], [`EmbeddingFeatures`]).
1010
1111
use candid::Principal;
12-
use serde::ser::{SerializeMap, SerializeSeq, Serializer};
1312
use serde::{Deserialize, Serialize};
1413
use serde_json::{Map, json};
1514
use std::collections::BTreeMap;
@@ -376,113 +375,13 @@ pub struct FunctionDefinition {
376375
pub description: String,
377376

378377
/// JSON schema defining the function's parameters.
379-
#[serde(serialize_with = "serialize_openapi_schema_ordered")]
380378
pub parameters: Json,
381379

382380
/// Whether to enable strict schema adherence when generating the function call. If set to true, the model will follow the exact schema defined in the parameters field. Only a subset of JSON Schema is supported when strict is true.
383381
#[serde(skip_serializing_if = "Option::is_none")]
384382
pub strict: Option<bool>,
385383
}
386384

387-
pub fn serialize_optional_openapi_schema_ordered<S>(
388-
value: &Option<Json>,
389-
serializer: S,
390-
) -> Result<S::Ok, S::Error>
391-
where
392-
S: Serializer,
393-
{
394-
match value {
395-
None => serializer.serialize_none(),
396-
Some(v) => serialize_openapi_schema_ordered(v, serializer),
397-
}
398-
}
399-
400-
pub fn serialize_openapi_schema_ordered<S>(value: &Json, serializer: S) -> Result<S::Ok, S::Error>
401-
where
402-
S: Serializer,
403-
{
404-
struct Ordered<'a>(&'a Json);
405-
406-
impl<'a> serde::Serialize for Ordered<'a> {
407-
fn serialize<S2>(&self, serializer: S2) -> Result<S2::Ok, S2::Error>
408-
where
409-
S2: Serializer,
410-
{
411-
serialize_openapi_schema_ordered(self.0, serializer)
412-
}
413-
}
414-
415-
match value {
416-
Json::Null => serializer.serialize_none(),
417-
Json::Bool(b) => serializer.serialize_bool(*b),
418-
Json::Number(n) => n.serialize(serializer),
419-
Json::String(s) => serializer.serialize_str(s),
420-
Json::Array(items) => {
421-
let mut seq = serializer.serialize_seq(Some(items.len()))?;
422-
for item in items {
423-
seq.serialize_element(&Ordered(item))?;
424-
}
425-
seq.end()
426-
}
427-
Json::Object(map) => {
428-
// Gemini preview models can be sensitive to schema key order.
429-
// Emit a deterministic, schema-friendly ordering recursively:
430-
// 1) common schema keys in a fixed order
431-
// 2) remaining keys in lexical order
432-
433-
// https://ai.google.dev/api/caching#FunctionDeclaration
434-
const FIXED_ORDER: [&str; 23] = [
435-
"name",
436-
"type",
437-
"format",
438-
"title",
439-
"description",
440-
"nullable",
441-
"enum",
442-
"maxItems",
443-
"minItems",
444-
"properties",
445-
"required",
446-
"minProperties",
447-
"maxProperties",
448-
"minLength",
449-
"maxLength",
450-
"pattern",
451-
"example",
452-
"anyOf",
453-
"propertyOrdering",
454-
"default",
455-
"items",
456-
"minimum",
457-
"maximum",
458-
];
459-
460-
let mut out = serializer.serialize_map(Some(map.len()))?;
461-
462-
for key in FIXED_ORDER {
463-
if let Some(v) = map.get(key) {
464-
out.serialize_entry(key, &Ordered(v))?;
465-
}
466-
}
467-
468-
let mut rest_keys: Vec<&str> = map
469-
.keys()
470-
.map(|k| k.as_str())
471-
.filter(|k| !FIXED_ORDER.contains(k))
472-
.collect();
473-
rest_keys.sort_unstable();
474-
475-
for key in rest_keys {
476-
if let Some(v) = map.get(key) {
477-
out.serialize_entry(key, &Ordered(v))?;
478-
}
479-
}
480-
481-
out.end()
482-
}
483-
}
484-
}
485-
486385
impl FunctionDefinition {
487386
/// Modifies the function name with a prefix.
488387
pub fn name_with_prefix(mut self, prefix: &str) -> Self {

anda_engine/src/model/gemini/types.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use anda_core::{
22
AgentOutput, BoxError, ByteBufB64, ContentPart, FunctionDefinition, Message,
3-
Usage as ModelUsage, model::serialize_optional_openapi_schema_ordered,
3+
Usage as ModelUsage,
44
};
55
use serde::{Deserialize, Serialize};
66
use serde_json::{Map, Value, json};
@@ -652,11 +652,9 @@ pub struct FunctionDeclaration {
652652
pub description: String,
653653

654654
#[serde(skip_serializing_if = "Option::is_none")]
655-
#[serde(serialize_with = "serialize_optional_openapi_schema_ordered")]
656655
pub parameters: Option<Value>,
657656

658657
#[serde(skip_serializing_if = "Option::is_none")]
659-
#[serde(serialize_with = "serialize_optional_openapi_schema_ordered")]
660658
pub response: Option<Value>,
661659
}
662660

anda_engine/src/model/openai/types.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use anda_core::{
2-
AgentOutput, BoxError, ContentPart, Json, Message, Usage as ModelUsage,
3-
model::serialize_openapi_schema_ordered,
4-
};
1+
use anda_core::{AgentOutput, BoxError, ContentPart, Json, Message, Usage as ModelUsage};
52
use serde::{Deserialize, Serialize};
63
use serde_json::{Map, json};
74

@@ -389,7 +386,6 @@ pub struct ToolDefinition {
389386
/// Tool name
390387
pub name: String,
391388
/// Parameters - this should be a JSON schema. Tools should additionally ensure an "additionalParameters" field has been added with the value set to false, as this is required if using OpenAI's strict mode (enabled by default).
392-
#[serde(serialize_with = "serialize_openapi_schema_ordered")]
393389
pub parameters: Json,
394390
/// Whether to use strict mode. Enabled by default as it allows for improved efficiency.
395391
pub strict: bool,

0 commit comments

Comments
 (0)